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

What happens if NullPointerException is not handled in main() method?

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

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
        }
    }
}

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

认为 Hovercraft Full Of Eels 是正确的,处理 NPE 通常是不好的做法。您可以像处理任何其他未经检查的异常一样处理它。

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

您可以在此处阅读有关未经检查的异常的信息 https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

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

As we already know the Null pointer Exception is propagated implicitly without using throws keyword to main method

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

but is it necessary if it should be handled in the main method.

这取决于你所说的 "necessary." 是什么意思未处理的 NPE。

通常的做法是不要捕获 NullPointerException,因为您的代码永远不应抛出 NPE,因此如果它抛出,则这是您要修复的错误(通过找出抛出 NPE 的原因并修复那),而不是通过捕捉 NPE。

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

NullPointerException 是一个 RuntimeException 并非旨在 专门 被客户端捕获(与 JDK RuntimeException例如 ArrayIndexOutOfBoundsException, ArithmeticException, .... ).
抛出此错误通常意味着引发此问题的实际代码存在问题。
但是我们应该抓住它吗?
其实这要看class/component的观点了。

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

2) 在其他情况下,我们知道 NullPointerException 是一个编程错误,但我们不希望它停止程序并传播给应用程序用户。所以我们想捕获 NullPointerException 但也想捕获任何可能导致程序异常终止的异常。
所以我们将 "risky" 代码包含在 catch(Exception) 语句中。

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

  1. 您正在从 static 上下文(主)中调用 non-static 方法(检查) .

  2. 你没有在你的main方法中处理IOException, SQLException异常(抛出它们或者用try catch包围它们)

    这与NPE(Null pointer exception)无关,正如其他人所说,Null Pointer Exception是编译器允许的,因为它是未经检查的异常。