首页 文章

已检查vs未经检查的异常

提问于
浏览
10

我强迫客户端程序员捕获异常或在throws子句中声明它 . 事实上,客户端程序员可能甚至不知道可能抛出异常 . 例如, StringIndexOutOfBoundsException 由String的 charAt() 方法抛出 .

这是什么意思?

根据该代码,不需要在代码中放置try catch块,但我已经看到编译器强制将代码放入try catch块中 .

我很困惑他们到底是什么?

4 回答

  • 3

    未经检查的异常是扩展 RuntimeException 类的异常 . 编译器永远不会强制您捕获此类异常或强制您使用 throws 关键字在方法中声明它 . 检查所有其他异常类型(不扩展 RuntimeException ),因此必须声明抛出和/或捕获 .

    当您希望方法的调用者(即API的用户)明确处理API中的异常情况时,将使用已检查的异常 . 当您认为该调用能够针对该异常情况执行某些有意义的操作时,将声明已检查的异常,例如重试调用,滚动更改或将其转换为某些用户可读的错误消息 .

    如果您认为调用可以对异常做任何有用的事情(特别是当它表示错误或API的错误用法时),则应该取消选中该异常 . 此外,具有太多已检查异常的API可能会令人烦恼(例如尝试使用java reflection API =)

  • 4

    你的问题到底是什么?编译器不应该(也不会)强制您尝试/捕获未经检查的异常,这将与它们完全相反 .

    一般的想法是,经过检查的异常是您可以预见的,但可能基于您无法控制的输入以及您必须处理的输入 . 未经检查的异常通常代表程序中的错误 .

    有许多人认为在Java平台中检查异常是一个错误,他们只是非常谨慎地使用它们或根本不使用它们 . 您可以通过搜索谷歌阅读有关此辩论的更多信息 .

  • 19

    这是因为,

    • 未经检查的异常不是程序员预期会对它做很多事情的结果 .

    • 在Checked Exception的情况下,由于程序员的错误而产生的异常通常可由程序员自己解决 .

    检查以下链接:

    Why RunTime Exceptions are unchecked ?
    Checked vs Unchecked Exception ?

  • 1
    • Checked Exceptions对于处理程序正常运行中发生的事件非常有用 . 一个例子是无法打开文件时抛出的 IOException . 即使程序没有任何问题,也会发生这些异常 . 因此,有必要告诉程序如何处理异常 .

    • 未经检查的异常对于识别代码中的缺陷很有用 . 例如,在 null 对象上读取值时会抛出 NullPointerException . 因此,未经检查的异常表示需要程序员手动修复的问题 . 程序崩溃以避免错误行为是合理的,因此不需要try-catch块(但可能需要提供缓解,例如向用户显示错误) .

相关问题