我在Java中的一些方法会抛出异常,例如NoSuchElementException,IllegalArgumentException等 . 但是在使用这些方法时,这些异常似乎未经检查 . 换句话说,我的方法的调用者不需要对抛出这些异常的方法执行try / catch . 我读到它似乎默认情况下“异常”被“检查”,只有错误是“未选中” . 但不知何故,我抛出的例外情况也未经检查 . 真奇怪 .
我怎样才能确保当我的方法抛出异常时,调用者必须在编译时捕获异常?简单地说,我如何抛出一个检查过的异常?
谢谢!
6 回答
看到这个hack,它可能有所帮助(希望它不是OT) .
除了Error和RuntimeException的子类之外,检查Throwable的所有子类 . (你可以直接子类Throwable)
编译器会检查这些异常,但它们在运行时没有特殊的位置 . 即,您可以在编译器不知情的情况下抛出已检查的异常,并且它将正常运行 .
例如
这会按照您的预期编译并打印Throwable .
不必声明扩展
RuntimeException
的异常 .您可以声明方法:
throws Exception
甚至throws Throwable
并且必须处理(尽管不建议) .是否检查了异常是 NOT 如何抛出或声明它,它只取决于您选择的异常是否是从RuntimeException派生的 . 您在上面列出的那些都是从RuntimeException派生的,因此您的方法的客户端不需要捕获它们 .
仅取消选中
RuntimeException
及其子类 . (好吧,Error
及其子类也是如此,但你不应该搞乱Error
. )你需要做的就是抛出一个已检查的异常,确保它不会扩展RuntimeException
.我认为你应该退后一步,学习为什么抛出一个检查异常与未经检查的异常背后的理论 . 关于异常的Java tutorial是一个很好的资源 .
从 Headers 为Unchecked Exceptions — The Controversy的页面: