重新抛出异常如何由外部捕获终止?

how does rethrow exception terminate by outer catch?

enter code here
  `class Rethrow
   {
    public static void genException()
   {
        int n[]={4,8,16,32,64,128};
        int d[]={2,0,8,0,4};

        for(int i=0;i<n.length;i++)
        {                                     
            try{
                System.out.println("n/d is:"+n[i]/d[i]);

               }
            catch(ArithmeticException exc)
              {
                System.out.println("Cant Divide By Zero");
                throw exc;
              }
            catch(ArrayIndexOutOfBoundsException exc)
             {
                System.out.println("No match element found ");
                // rethrow the exception
             }
        }
    }
}

class RethrowDemo
{
    public static void main(String args[])
    {
        try 
        {
            Rethrow.genException();
        }
        catch(ArithmeticException exc)  // catch the rethrow Exception
        {
            // recatch exception
            System.out.println("Fatal Error "+"Program Termiated.");
        }
    }
}

问题 1::why 确实 catch of "RethrowDemo" CLASS 终止了由 "Rethrow" class.[=12= 的 catch(Arithmetic Exception) 抛出的异常]

问题 2:: 控制权转移如何运作??

在 Java 中,当发生中断应用程序 正常 流程的事件时,将创建一个 Exception 对象并将其传递给调用堆栈要么由调用者处理,要么进一步传递给层次结构中更高层的其他东西处理with/handled。

由于您不能除以零这一事实,ArithmeticException 从行 System.out.println("n/d is:"+n[i]/d[i]); 中抛出,并且由于您是在 try...catch 块中执行此操作,因此您的 catch(ArithmeticException exc) 说 "If there is an ArithmeticException thrown from within the try then I'm here to deal with it"。

正是在这个 catch 块中,您正在打印出 Cant Divide By Zero 然后重新抛出原始异常。然后这会冒泡到调用方法,在你的情况下是 main 方法但是因为你是从 try...catch(ArithmeticException exc) 中进行调用的 catch in main 说 "I will deal with that ArithmeticException that you have just re-thrown"。正是在这一点上,您然后打印 Fatal Error Program Termiated 并且应用程序结束。

有很多教程可以完整解释异常在 Java 中的工作原理,因此看一看其中的一些会很有用。

A Tutorial on Exceptions

Another Tutorial on Exceptions