不能使用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。
- 为什么UmbrellaException有这个名字?
- 将Hibernate配置放在不同的位置
- MediaSession finishBroadcast()exception
- 无法从无处构建Hibernate SessionFactoryexception
- 读取xlsx文件时出现apache POIexception
- 使用javax.sound.sampled.Clip在游戏中播放,循环和停止多个声音。 意外错误
- java.util.ConcurrentModificationException&iteration?
- Java:我如何编写try-catch-repeat块?
- 在Java中检查二维数组中的邻居的更有效方法