NullPointerException
”很普遍,为什么它没有被声明为已检查的异常?我在谷歌上搜过,但没有找到合适的答案。NullPointerException
”很普遍,为什么它没有被声明为已检查的异常?我在谷歌上搜过,但没有找到合适的答案。几乎每个方法都必须声明抛出它。
public void myMethod(String param) throws NullPointerException {
//
}
(顺带一提,例如Eclipse会在存在“可能的空指针访问”时发出警告,以便您尽早预防异常。)
这不是一个检查异常(等等原因),因为它非常普遍。它几乎可以在任何地方发生。如果它是被检查出来的,那么几乎每个 Java 程序中的每个方法都必须声明它会抛出 NullPointerException
。
空指针异常是运行时异常的扩展,因此它们是程序流程中意外发生的。期望抛出空指针异常是没有意义的(希望如此!),因此您永远不会将其声明为受检异常。
检查异常可能会发生,因为程序无法控制的环境出了问题(例如IOException
、SQLException
)。你可以预见到并处理这种情况。
NullPointerException
通常发生是因为代码中存在一些错误。如果你期望抛出NullPointerException,则正确的解决方案是修复错误而不是处理异常。
LoginException
。或者,在某些业务场景下,AccountService
可能会抛出InsufficientBalanceException
。因此,它们本质上并非与“环境”相关。 - ring bearer我给出的简短回答是,这是程序错误的结果,而程序错误异常不是被检查的异常(IllegalStateException、ClassCastException等)。
但即使你有理由认为它应该是一个被检查的异常,基本上每个操作对象引用的操作都可能抛出它,所以它会无处不在,非常麻烦,而且每个非平凡程序中的方法都必须抛出它——那还有什么意义呢?
我对检查异常的定义是,当API出现已知的不良情况时会引发检查异常。
NullPointerException
并不表示"已知的不良"情况。相反,它们通常是由于代码中存在某些未处理的情况而抛出的。也就是说,它们大部分时间都是由于糟糕的编码实践导致的——例如尝试获取未正确初始化的列表的大小等。因此,没有必要将它们作为检查异常——因为Java中的每个对象在某个时刻都可能为空?!NullPointerException
也永远不应该被捕获。
if(myList != null)
这样的检查语句。除此之外,在代码中不应该有类似于catch(NullPointerException npe)
的内容。那样的话,它应该永远不会通过代码审查。 - ring bearercreateNewFile()
时,可能会发生已知的不良反应,如磁盘空间不足。 - ring bearer已检查异常仅适用于程序可以恢复的异常。在 NULL 对象上调用某些内容是程序员的问题,无法恢复。
为什么要包含它,当你编写的每个函数都必须声明它?只是为了让你的生活更简单。
如果发生空指针异常,您的程序将会停止运行。因此,它是未被检查的异常。
public void myMethod(String param) does not throw NullPointerException
或使用!throws
。 - asmaier