java中内部catch的异常

时间:2018-04-26 18:43:43

标签: java exception-handling

在下面的代码中,异常会在内部catch块中引发,因此理想情况下它应该被外部catch块捕获,并且应该导致正常执行。 但是当我执行时,它没有捕获到外部catch块仍然正常执行而没有任何堆栈跟踪。

我的疑问是,如果它已经正常执行(没有堆栈跟踪)那么它必须被外部捕获(“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 :(得分:0)

NullPointerException不会在代码中的任何位置抛出。因此,执行永远不会到达除以零的catch块,因此也不会引发算术异常。

尝试在System.out.println("6");之后添加以下内容:

Object obj = null;
obj.toString();

使NullPointerException被抛出。

答案 1 :(得分:0)

代码变化不大:

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块也没有执行。

答案 2 :(得分:0)

抛出异常的唯一行是初始化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");
}