检查(取消)已检查的异常(Java)

时间:2013-07-02 22:31:46

标签: java exception runtime compile-time

我很难解释这两个(看似简单)句子的含义:

“编译器在编译时检查已检查的异常”

这是什么意思?编译器检查是否捕获了所有已检查的异常(在de代码中抛出)?

“在运行时检查未经检查的异常,而不是编译时”

这句话中“检查”的含义是什么?我认为未经检查的异常只是在运行时抛出

4 个答案:

答案 0 :(得分:1)

  • 编译时

有两种类型:

  1. 已选中:表示该方法是否抛出所需的异常
  2. 未处理的已检查异常:如果方法未抛出到所需的异常,则会导致编译错误。

    • 在运行时
  3. 在运行时调用 未经检查的异常 ,无需显式处理。 RuntimeException及其子类或错误及其子类都属于未选中

答案 1 :(得分:1)

在我看来,第二个陈述不正确。或者如果它是正确的,它使用“检查”来表示与第一句中的含义不同的东西。这是一个误导和无益的事情。

如果您为这些句子提供了上下文(和来源),我可能会被说服。


  

我认为未经检查的异常只是在运行时被抛出?

它们也可以(可以)在运行时捕获......而可能这就是引用的含义。但如果这就是它的含义,那就是扭曲了“检查”的正常含义......参见前面关于“误导和无益”的说明。

答案 2 :(得分:0)

将它们读作可能更清楚:

“在编译时编译器检查了异常(测试是否存在匹配的try / catch)” - 如果没有,代码将无法编译

“未经检查的异常是(在运行时测试是否有匹配的try / catch),而不是编译时间” - 如果没有,代码将崩溃

答案 3 :(得分:-1)

我同意检查未经检查的例外部分确实具有误导性。更好的解释是将所有Java throwable分为三类:

  • 已检查的例外
  • 运行时例外
  • 错误

我个人更喜欢将Checked异常视为代码中必须捕获的内容,以及Runtime异常 - 作为可选的catch。您可以处理两者(例如,用于记录),但您应该尝试仅从已检查的那些中恢复。

检查异常往往会引入大量冗余catch子句。在某些情况下,捕获Checked异常,将其包装在一些未经检查的异常中并进一步传播它是有意义的。

始终牢记有效Java中的第41项:避免不必要地使用已检查的异常。换句话说,不要将已检查的异常用于调用者无法恢复的条件,或者只有可预见的响应才能使程序退出