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

时间:2016-07-19 12:48:23

标签: java exception rethrow

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.");
        }
    }
}

this is output of program

问题1 ::为什么要抓住&#34; RethrowDemo&#34; CLASS终止了&#34; Rethrow&#34;的catch(算术异常)引发的异常。类。

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

1 个答案:

答案 0 :(得分:0)

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

由于您无法除以零,ArithmeticException会从行System.out.println("n/d is:"+n[i]/d[i]);中抛出try...catch,因为您在catch(ArithmeticException exc)块内执行此操作,你的ArithmeticException说&#34;如果try内有catch,那么我就来处理它&#34;。

Cant Divide By Zero块中,您打印出main,然后重新抛出原始异常。然后,这会调整为调用方法,在您的情况下为try...catch(ArithmeticException exc)方法,但是因为您正在catchmain ArithmeticException中说{&1}} 34;我将处理你刚刚重新抛出的Fatal Error Program Termiated&#34;。此时您将打印{{1}}并结束应用程序。

有很多教程可以完全解释异常如何在Java中运行,因此查看一些内容会很有用。

A Tutorial on Exceptions

Another Tutorial on Exceptions