不能使用try / catch块处理java未经检查的exception?

在一个教程中,我发现你的代码无法处理Unchecked Exception,即我们不能使用try/catch块,例子是ArrayIndexOutOfBoundsException, NullPointerException.等exceptionArrayIndexOutOfBoundsException, NullPointerException. 但是这些exception可以使用try / catch块来处理。 我想我不清楚这个概念!!

另外我认为throw关键字只能用于try/catch block.can throw关键字与UncheckedException一起使用?

已检查和未检查的exception之间的唯一区别是, 必须使用throws在方法签名中捕获或声明检查的throws ,而对于未经检查的throws ,这是可选的。

您的代码无法处理未经检查的exception,即我们无法使用try / catch块

当然,我们可以 – 但我们没有必要。

另外我认为throw关键字只能用于try / catch block.can throw关键字与Unchecked Exception一起使用?

请注意,有两个关键字:

  • throw显式抛出您创建的exception对象。 throw new NullPointerException(); 虽然明确地创建了这个特殊的exception并不常见,但大多数人都会认为它的风格很糟糕。
  • throws声明方法可能抛出该exception。 使用未经检查的exception,这是可选的,但可以用于记录事实(同样,通常不会声明throws NullPointerException因为这几乎是给定的)。

所有未经检查的exception都可以用与检查的exception相同的方式处理 – 如果需要,可以通过声明方法throws它们来让它们通过:

 public void m() throws RuntimeException {} 

或者你可以catch它们:

 public void m() { try { // some code } catch (RuntimeException re) { // do something } } 

应该注意的是,类RuntimeException充当未经检查的exception的全部(因为所有未经检查的exception都从它扩展),这与Exception类是已检查exception的全部捕获的方式非常相似。

如前所述,唯一真正的区别是,对于已检查的exception,您必须处理它们(通过让它们通过或捕获它们)并且编译器将确保它 – 另一方面,未经检查的exception的处理是可选的。

这一切都归结为每种exception类型的预期用法 – 你应该能够从已检查的exception中恢复(或至少在它们发生时对它们做些什么),而对于未经检查的exception,可能没有合理的从他们身上恢复的方法。 这当然有点主观。

它们可以被处理,但你没有必要 。 如果你不处理它们,它们将传播并爬上调用方法堆栈,直到其中一个捕获它。 如果没有,程序将崩溃。

通常,底线是如果可以合理地期望客户端从exception中恢复,那么它应该是一个经过检查的exception 。 如果客户端无法执行任何操作以从exception中恢复,则可以将其作为未经检查的exception

此外,已检查的exception对于记录您希望第三方使用的API非常有用。 当他们知道你的方法可以抛出一个特定的exception时,他们会相应地编码并处理这个案例。 如果您只使用未经检查的例外 ,则所有投注均已关闭。

一种常见的模式(有些人不喜欢它,但在某些情况下,当你知道自己在做什么时它是可以的)就是将抛出的已检查exception包装到未经检查的模式中。

 try { ... code that can throw CheckedException ... } catch (CheckedException oopsSomethingBadHappened) { throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened); } 

除纪尧姆外:

  • 未经检查的exception通常是编程错误,如果正确实现(索引超出范围,空指针,类强制转换……),则根本不会发生这种错误,因此调用者/用户通常无法对它们做任何事情。
  • 抛出已检查的exception,因为它超出了程序员的控制范围(网络不可用,文件系统不可用,并发修改,例如重复的主键,……)
  • JVM通常会抛出错误,应用程序通常必须停止(内存不足,堆栈溢出……)

考虑差异的一种简单方法是认为检查是指编译。 如果exception是检查exception,编译器将检查您的代码是否抛出exception或在编译时在try / catch块中处理它。 对于未经检查的exception,编译器不会进行此类检查。 您可以以相同的方式处理已检查/未检查的exception(使用try / catch / throws),区别仅在于编译器执行的检查。 这篇文章有一个很好的例子 。

是的,您可以使用throw抛出未经检查的exception。 是的,您可以在catch块中捕获未经检查的exception。