Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java内部捕获中的异常_Java_Exception Handling - Fatal编程技术网

java内部捕获中的异常

java内部捕获中的异常,java,exception-handling,Java,Exception Handling,在下面的代码中,异常是在内部catch块中引发的,所以理想情况下,它应该被外部catch块捕获,并且应该导致正常执行。 但当我执行时,它并没有被捕获在外部catch块中,仍然正常执行,没有任何堆栈跟踪 我的疑问是,如果它正常执行(没有堆栈跟踪),那么它一定是被外部捕获(应该打印“10”)捕获的 代码: 输出: 1 2 3 4 5 6 8 9 11 12 NullPointerException只是不会在代码中的任何地方抛出。结果,执行永远不会到达被零除的catch块,因此也不会引发算术异常 尝

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

我的疑问是,如果它正常执行(没有堆栈跟踪),那么它一定是被外部捕获(应该打印“10”)捕获的

代码:

输出:

1
2
3
4
5
6
8
9
11
12

NullPointerException
只是不会在代码中的任何地方抛出。结果,执行永远不会到达被零除的catch块,因此也不会引发算术异常

尝试在
System.out.println(“6”)之后添加如下内容


要使
NullPointerException
被抛出。

代码中的微小更改:

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块。请参阅
内挡块
未打印<代码>最后执行
块,执行内部try块的其余代码。类似地,由于外部try块中没有发生异常,因此外部catch块也没有执行。

引发异常的唯一一行是初始化x时。 如果试图查看此异常,则必须将其移动到其中一个try块。它还会抛出一个算术异常而不是一个NullPointerException,因此您必须将catch块更改为算术异常或常规异常。下面的例子

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

我没有看到任何代码抛出一个
NullPointerException
为什么不简单地抛出一个NPE呢?我试图建模一个。。。现实场景:大多数野生NPE都是由VM引发的:),但可以肯定的是,更直接的方法是执行
引发新的NullPointerException()
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 {
        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");
}