Как исключение повторного выброса завершается внешним уловом?

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" завершает исключение, генерируемое уловом (Arithmetic Exception) класса "Rethrow".

Вопрос 2: как работает передача контроля??

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) тот catch в main говорит: "Я разберусь с этим ArithmeticException что вы только что перебросили ". Именно в этот момент вы затем печатаете Fatal Error Program Termiated и приложение заканчивается.

Существует множество учебных пособий, которые полностью объясняют, как работают исключения в Java, поэтому было бы полезно взглянуть на некоторые из них.

Учебник по исключениям

Еще один учебник по исключениям

Другие вопросы по тегам