为什么不检查运行时异常(而不是检查它们)是有意义的?
1bqhqjot1#
这仅仅意味着编译器不会强制您查找异常,但您仍然可以在运行时抛出它。作为一个好处,这允许您从类中抛出新的异常,而无需更改接口,从而导致调用方更改其代码。
l2osamch2#
java中两种异常(checked和unchecked)的思想是,checked异常应该用于可以合理预期会发生的错误情况,unchecked异常应该用于意外的错误情况。例如,如果找不到文件,则会得到 FileNotFoundException ,并且期望您的程序能够处理这种情况是合理的。未检查的异常应该只用于不应该发生的问题,这实际上意味着如果发生这样的问题,程序中就有一个bug。例如,一个 NullPointerException 意味着您的程序正在尝试取消引用一个 null 那很可能是个虫子。java编译器强制程序员处理检查过的异常。这使得编程语言更安全—这意味着程序员被迫考虑错误条件,这应该使程序更健壮。编译器不会检查未检查的异常,因为未检查的异常无论如何都不应该发生,如果发生了,程序在运行时就不能合理地执行任何操作;程序员必须解决这个错误。java中的这个特性受到了一些批评,有些人甚至称检查异常为失败的实验,有些人建议从java中删除检查异常。
FileNotFoundException
NullPointerException
null
pdkcd3nj3#
否则,每次访问数组元素、执行除法操作和许多其他常见场景时,都必须使用try/catch块。换言之,想象一下这个代码:
Map map = ... int i = ... (int[])map.get("foo")[3] = 2334 / i;
必须检查 ClassCastException , ArrayIndexOutofBoundsException , ArithmeticException , UnsupportedOperationException 以及 NullPointerException 就在我头上。对于java,这个问题不是未检查的异常。检查异常是一个极具争议的主题。有人说这在很大程度上是一个java实验,实际上它们不起作用,但你会发现很多人认为它们很好。然而,没有人认为未经检查的例外情况是不好的。
ClassCastException
ArrayIndexOutofBoundsException
ArithmeticException
UnsupportedOperationException
3条答案
按热度按时间1bqhqjot1#
这仅仅意味着编译器不会强制您查找异常,但您仍然可以在运行时抛出它。作为一个好处,这允许您从类中抛出新的异常,而无需更改接口,从而导致调用方更改其代码。
l2osamch2#
java中两种异常(checked和unchecked)的思想是,checked异常应该用于可以合理预期会发生的错误情况,unchecked异常应该用于意外的错误情况。
例如,如果找不到文件,则会得到
FileNotFoundException
,并且期望您的程序能够处理这种情况是合理的。未检查的异常应该只用于不应该发生的问题,这实际上意味着如果发生这样的问题,程序中就有一个bug。例如,一个NullPointerException
意味着您的程序正在尝试取消引用一个null
那很可能是个虫子。java编译器强制程序员处理检查过的异常。这使得编程语言更安全—这意味着程序员被迫考虑错误条件,这应该使程序更健壮。
编译器不会检查未检查的异常,因为未检查的异常无论如何都不应该发生,如果发生了,程序在运行时就不能合理地执行任何操作;程序员必须解决这个错误。
java中的这个特性受到了一些批评,有些人甚至称检查异常为失败的实验,有些人建议从java中删除检查异常。
pdkcd3nj3#
否则,每次访问数组元素、执行除法操作和许多其他常见场景时,都必须使用try/catch块。
换言之,想象一下这个代码:
必须检查
ClassCastException
,ArrayIndexOutofBoundsException
,ArithmeticException
,UnsupportedOperationException
以及NullPointerException
就在我头上。对于java,这个问题不是未检查的异常。检查异常是一个极具争议的主题。有人说这在很大程度上是一个java实验,实际上它们不起作用,但你会发现很多人认为它们很好。
然而,没有人认为未经检查的例外情况是不好的。