我很难解释这两个(看似简单)句子的含义:
“编译器在编译时检查已检查的异常”
这是什么意思?编译器检查是否捕获了所有已检查的异常(在de代码中抛出)?
“在运行时检查未经检查的异常,而不是编译时”
这句话中“检查”的含义是什么?我认为未经检查的异常只是在运行时抛出?
答案 0 :(得分:1)
有两种类型:
未处理的已检查异常:如果方法未抛出到所需的异常,则会导致编译错误。
在运行时调用 未经检查的异常 ,无需显式处理。
RuntimeException
及其子类或错误及其子类都属于未选中。
答案 1 :(得分:1)
在我看来,第二个陈述不正确。或者如果它是正确的,它使用“检查”来表示与第一句中的含义不同的东西。这是一个误导和无益的事情。
如果您为这些句子提供了上下文(和来源),我可能会被说服。
我认为未经检查的异常只是在运行时被抛出?
它们也可以(可以)在运行时捕获......而可能这就是引用的含义。但如果这就是它的含义,那就是扭曲了“检查”的正常含义......参见前面关于“误导和无益”的说明。
答案 2 :(得分:0)
将它们读作可能更清楚:
“在编译时编译器检查了异常(测试是否存在匹配的try / catch)” - 如果没有,代码将无法编译
“未经检查的异常是(在运行时测试是否有匹配的try / catch),而不是编译时间” - 如果没有,代码将崩溃
答案 3 :(得分:-1)
我同意检查未经检查的例外部分确实具有误导性。更好的解释是将所有Java throwable分为三类:
我个人更喜欢将Checked异常视为代码中必须捕获的内容,以及Runtime异常 - 作为可选的catch。您可以处理两者(例如,用于记录),但您应该尝试仅从已检查的那些中恢复。
检查异常往往会引入大量冗余catch子句。在某些情况下,捕获Checked异常,将其包装在一些未经检查的异常中并进一步传播它是有意义的。
始终牢记有效Java中的第41项:避免不必要地使用已检查的异常。换句话说,不要将已检查的异常用于调用者无法恢复的条件,或者只有可预见的响应才能使程序退出。