在下面的示例代码片段中,在从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
}
}
}
编译错误发生在check(26);
代码行抛出SQL异常,IO异常,它是从check(int a)
方法显式传播到main()方法的已检查异常。如果在main()方法中没有处理NullPointerException,那么它在哪里被处理?
思想气垫船满鳗鱼是正确的,处理NPE通常是不好的做法。您可以处理它以及任何其他未经检查的异常。
try {
// your code
check(26);
} catch (NullPointerException e) {
// do something
}
你可以在这里阅读有关未经检查的例外情况https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
正如我们已经知道的那样,Null指针异常是在不使用throws关键字到main方法的情况下隐式传播的
不必要。如果未处理,它将向上传播调用树到任何入口点。如果您通过java
工具(或其他调用main
的东西)运行代码,那将是main
,但如果您使用Swing,或编写servlet等,它可能是一个不同的入口点(它肯定会,用servlet)。
但如果应该在主方法中处理它是否必要。
这取决于你所说的“必要”。如果不这样做,并且您使用java
工具运行代码,那么如果存在未处理的NPE,您的程序将终止。
通常的做法是不要捕获NullPointerException
,因为你的代码永远不应该抛出NPE,所以如果确实如此,那就是你想修复的bug(通过找出为什么NPE被抛出并修复它),而不是通过捕获NPE 。
在运行时将抛出空指针异常,即使我们处理它也会被传播这个异常会讨论数据
首先:请注意,在实际代码中,您不会抛出相关的异常。
所有这些错误情况应该抛出IllegalArgumentException
。
NullPointerException
是一个RuntimeException
,不是专门为客户设计的(正如许多JDK RuntimeException
,如ArrayIndexOutOfBoundsException
,ArithmeticException
,......)。
抛出它时,通常意味着引发问题的实际代码存在问题。
但是我们应该抓住它吗?
实际上,它取决于必须应对的类/组件的视图点。
1)如果从抛出NullPointerException
的组件/类的角度来看,我们认为这是一个应由开发人员纠正的编程错误,我们希望它被传播到类的客户端。
所以我们不想抓住它。
2)在其他情况下,我们知道NullPointerException
是编程错误但我们不希望它停止程序并传播给应用程序用户。所以我们想要捕获NullPointerException
,但也有任何可能导致异常程序终止的异常。
因此,我们将“风险”代码包含在catch(Exception)
语句中。
您的代码有几个问题,它不会编译,因为: