如果在main()方法中没有处理NullPointerException会发生什么?

时间:2018-04-07 15:02:55

标签: java exception-handling nullpointerexception

在下面的示例代码片段中,在从check()方法隐式传播到main()方法后,main()方法中没有处理NullPointerException。

class Simple {
    public static void main(String[] args) {
        check(26);
    }

    public static void check(int a) throws SQLException, IOException {
        if (a % 2 == 0) {
            throw new NullPointerException("it is divisible by 2"); //we are raising a Null pointer exception here
        } else if (a % 3 == 0) {
            throw new IOException("it is divisible by 3"); //we are raising a IO Exception here
        } else if (a % 5 == 0) {
            throw new SQLException("it is divisible by 5"); //we are raising a SQL Exception here
        }
    }
}

编译错误发生在抛出SQL异常的check(26);代码行,IO异常,它是从check(int a)方法显式传播到main()方法的已检查异常。如果在main()方法中没有处理NullPointerException,那么它在哪里被处理?

5 个答案:

答案 0 :(得分:2)

  

我们已经知道Null指针异常是在不使用throws关键字到main方法的情况下隐式传播的

不一定。如果未处理,它将向上传播调用树到任何入口点。如果您通过java工具(或其他调用main的内容)运行代码,那将是main,但如果您正在使用Swing,或者编写servlet等。,它可能是一个不同的入口点(它当然会带有一个servlet)。

  

但是如果应该在main方法中处理它是必要的。

这取决于你所说的“必要”。如果您没有,并且使用java工具运行代码,那么如果存在未处理的NPE,您的程序将终止。

通常的做法是不捕获NullPointerException,因为你的代码永远不会抛出NPE,所以如果确实如此,那就是你想修复的bug(通过找出为什么NPE被抛出并修复它)而不是通过捕捉NPE。

答案 1 :(得分:1)

思想气垫船满鳗鱼是正确的,处理NPE通常是不好的做法。您可以处理它以及任何其他未经检查的异常。

try {
    // your code
    check(26);
} catch (NullPointerException e) {
    // do something
}

您可以在此处阅读有关未经检查的例外情况 https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

答案 2 :(得分:0)

在运行时将抛出空指针异常,即使我们处理它也会传播它 此异常涉及数据

答案 3 :(得分:0)

首先:请注意,在您的实际代码中,您不会抛出相关的例外情况 所有这些错误情况都应抛出IllegalArgumentException

NullPointerException是一个RuntimeException,并非设计为专门被客户端捕获(与RuntimeException ArrayIndexOutOfBoundsException一样多的JDK ArithmeticException { {1}},....) 抛出它时,通常意味着引发问题的实际代码存在问题 但我们应该抓住它吗? 实际上,它取决于必须应对的类/组件的视图点。

1)如果从抛出NullPointerException的组件/类的角度来看,我们认为这是一个应由开发人员纠正的编程错误,我们希望它被传播到客户端班级。
所以我们不想抓住它。

2)在其他情况下,我们知道NullPointerException是编程错误,但我们不希望它停止程序并传播给应用程序用户。因此,我们希望捕获NullPointerException,但也可以捕获任何可能导致程序异常终止的异常 因此,我们将“有风险”的代码括在catch(Exception)语句中。

答案 4 :(得分:0)

您的代码有几个问题,因为以下内容无法编译:

  1. 您正在从静态上下文(主要)中调用非静态方法(检查)。
  2. 您还没有在main方法中处理 IOException,SQLException 异常(抛出它们或用try catch包围它们)

    这与 NPE(空指针异常)无关,并且正如其他人所说的那样,编译器允许空指针异常,因为它是未经检查的异常。