Исключение во внутреннем улове в Java - PullRequest
0 голосов
/ 26 апреля 2018

В приведенном ниже коде Исключение возникает во внутреннем блоке перехвата, поэтому в идеале оно должно быть перехвачено внешним блоком перехвата, что должно привести к нормальному выполнению. Но когда я выполнил, он не перехватывается во внешнем блоке перехвата, все еще выполняется нормально без какой-либо трассировки стека.

Я сомневаюсь, что если он выполнялся нормально (без трассировки стека), то он должен быть перехвачен внешним перехватчиком (должно было быть напечатано «10»)

Код:

public class Test2 {


    public static void main(String[] args)  {

        try {
            System.out.println("1");
            System.out.println("2");

            System.out.println("3");
            try {
                System.out.println("4");
                System.out.println("5");

                System.out.println("6");

                }
            catch(NullPointerException e)
            {
                int x=1/0;
            }
            finally
            {
                System.out.println("8");

            }
            System.out.println("9");
        }
        catch(ArithmeticException e)
        {
            System.out.println("10");
        }
        finally
        {
            System.out.println("11");
        }
        System.out.println("12");
    }

}

Выход:

1
2
3
4
5
6
8
9
11
12

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Маленькие изменения в вашем коде:

public class Test2 {
    public static void main(String[] args) {
        try {
            System.out.println("1");
            System.out.println("2");
            System.out.println("3");
            try {
                System.out.println("4");
                System.out.println("5");
            System.out.println("6");
            } catch (NullPointerException e) {
                System.out.println("Inner Catch Block");
                int x = 1 / 0;
            } finally {
                System.out.println("8");
            }
            System.out.println("9");
        } catch (ArithmeticException e) {
            System.out.println("10");
        } finally {
            System.out.println("11");
        }
        System.out.println("12");
    }
}

Поскольку во внутреннем блоке try не возникло исключений, внутренний блок catch не был выполнен. См. Inner Catch Block не печатать. Блок finally был выполнен, а остальная часть кода внутреннего блока try выполнена. Аналогично, поскольку во внешнем блоке try не возникло исключений, внешний блок catch также не был выполнен.

0 голосов
/ 26 апреля 2018

Единственная строка, которая выдаст исключение, будет при инициализации x. Если вы пытаетесь увидеть это исключение, вам придется переместить его в один из блоков try. Кроме того, он генерирует ArithmeticException , а не NullPointerException, поэтому вам придется изменить свой блок catch на ArithmeticException или общее исключение. Пример ниже.

    try {
        System.out.println("1");
        System.out.println("2");
        System.out.println("3");
        try {
            int x = 1 / 0;
        } catch (ArithmeticException e) {
            System.out.println("4");
            System.out.println("5");
            System.out.println("6");
        } finally {
            System.out.println("8");
        }
        System.out.println("9");
    } catch (ArithmeticException e) {
        System.out.println("10");
    } finally {
        System.out.println("11");
    }
    System.out.println("12");
}
0 голосов
/ 26 апреля 2018

NullPointerException просто не выбрасывается нигде в вашем коде. В результате выполнение никогда не попадает в тот блок перехвата, который имеет деление на ноль, поэтому арифметическое исключение также не вызывается.

Попробуйте добавить что-то вроде следующего после System.out.println("6");:

Object obj = null;
obj.toString();

чтобы сделать NullPointerException брошенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...