已检查vs未经检查的异常

时间:2011-01-09 13:39:00

标签: java exception-handling checked-exceptions runtimeexception

我研究过:但是,对于未经检查的异常,编译器不会强制客户端程序员捕获异常或在throws子句中声明它。事实上,客户端程序员可能甚至不知道可能抛出异常。例如,StringIndexOutOfBoundsException方法抛出charAt()

它的意思是什么?

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

我很困惑他们究竟是什么?

7 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:3)

这是因为,

  1. 未选中异常不是程序员错误的结果。相反,它们是严重的后果,我们(程序员)不会对它做太多的事情。
  2. 在Checked Exception的情况下,由于程序员的错误而产生的异常&经常可以由程序员自己解决。
  3. 检查以下链接:

    Why RunTime Exceptions are unchecked ?
    Checked vs Unchecked Exception ?

答案 3 :(得分:1)

  • 选中的异常对于处理程序正常运行中发生的事件非常有用。一个例子是当无法打开文件时抛出的IOException。即使程序没有任何问题,也会发生这些异常。因此,有必要告诉程序如何处理异常。
  • 未经检查的异常对于识别代码中的缺陷很有用。例如,在NullPointerException对象上读取值时会抛出null。因此,未经检查的异常表示需要程序员手动修复的问题。程序崩溃以避免错误行为是合理的,因此不需要try-catch块(但可能需要提供缓解,例如向用户显示错误)。

答案 4 :(得分:0)

**检查的异常

在编写代码的过程中要检查或处理的或应小心处理的异常称为检查异常。 例如: 1.我们有FileNotFoundException->在编写与文件类相关的一些代码时会发生。不存在文件将毫无保留地存在。在这种情况下,为了处理它们,我们必须确定要处理这些异常。 2.另外一个例子是ParseException,它将在我们处理日期函数时发生。

未经检查的异常

这些是在编码时可以处理的可选异常。是否处理它们取决于我们。如果我们无法处理它们,在执行过程中可能会出现运行时错误。 例如: 我们有一个叫做NullPointerException,ArithemeticException,NosSuchElementFoundException的东西。这些就像可选的东西,我们甚至不必处理它们。甚至jvm或编译器也不会建议我们处理它们。**

答案 5 :(得分:0)

所有异常都是运行时的一部分,而不是编译时。异常分为检查异常和未检查异常两种。已检查的异常的示例是IO异常,ClassNotFound异常,未检查的异常的示例是运行时异常。在检查异常的情况下,错误或警告消息会在编译时出现,以便用户在运行时使用throws关键字来照顾它,该关键字用于将异常抛出到默认的catch机制系统。但是,如果出现未经检查的异常,则在编译时不会发出警告。

答案 6 :(得分:0)

简单来说,

  • 检查异常是那些可以并且应该由您的代码处理的异常(因此编译器会强制您处理它们)
  • 未经检查的异常是那些超出程序员控制范围的异常(因此编译器不会强迫您处理它们)

即使在创建自定义例外时也使用相同的规则。