0
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::为什么“RethrowDemo”类的catch会终止“Rethrow”类的catch(Arithmetic Exception)抛出的异常。

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

4

1 回答 1

1

在 Java 中,当发生破坏应用程序正常Exception流程的事件时,会创建一个对象,并将其向上传递到调用堆栈以由调用者处理或进一步向上传递以由其他更高层处理/处理在层次结构中。

由于您不能除以零,ArithmeticException并且System.out.println("n/d is:"+n[i]/d[i]);由于您是在一个try...catch块内执行此操作,因此您会catch(ArithmeticException exc)说“如果ArithmeticException从内部抛出,try那么我会在这里处理它”。

正是在这个catch块中,您打印出Cant Divide By Zero然后重新抛出原始异常。然后,这会冒泡到调用方法,在您的情况下是main方法,但是由于您是从内部进行调用的try...catch(ArithmeticException exc),因此catchmain我将处理ArithmeticException您刚刚重新抛出的问题”。正是在这一点上,您然后打印Fatal Error Program Termiated并且应用程序结束。

有很多教程可以充分解释 Java 中的异常是如何工作的,因此看一些会很有用。

异常教程

另一个关于异常的教程

于 2016-07-19T13:22:15.300 回答