Ara*_* an 21 java exception-handling exception
在一个教程中,我发现你的代码无法处理未经检查的异常,即我们不能使用try/catch块,示例是例外,ArrayIndexOutOfBoundsException, NullPointerException.但这些异常可以使用try/catch块来处理.我想我不清楚这个概念!!
另外我认为throw关键字只能用于try/catchblock.can throw关键字可以用UncheckedException吗?
Mic*_*rdt 34
已检查和未检查的异常之间的唯一区别是,必须在方法签名中使用已捕获或声明已检查的异常throws,而对于未经检查的异常,这是可选的.
您的代码无法处理未经检查的异常,即我们无法使用try/catch块
当然,我们可以 - 但我们不必.
另外我认为throw关键字只能用于try/catch block.can throw关键字与Unchecked Exception一起使用?
请注意,有两个关键字:
throw显式抛出您创建的异常对象.throw new NullPointerException();虽然明确地创建了这个特殊的异常并不常见,但大多数人会认为它的风格很糟糕.throws声明方法可能抛出该异常.对于未经检查的异常,这是可选的,但可以用于记录事实(同样,通常不会声明,throws NullPointerException因为这几乎是给定的).所有未经检查的异常都可以像检查的那样处理 - 如果需要,可以通过声明方法来让它们通过throws:
public void m() throws RuntimeException {}
或者你可以catch:
public void m() {
    try {
        // some code
    } catch (RuntimeException re) {
        // do something
    }
}
应该注意的是,该类RuntimeException充当未经检查的异常的全部(因为所有未经检查的异常都从它扩展),这与Exception该类是已检查异常的全部捕获的方式非常相似.
如前所述,唯一真正的区别是,对于已检查的异常,您必须处理它们(通过让它们传递或捕获它们)并且编译器将确保它 - 另一方面,未经检查的异常的处理是可选的.
这一切都归结为每种异常类型的预期用法 - 你应该能够从已检查的异常中恢复(或至少在它们发生时对它们做些什么),而对于未经检查的异常,可能没有合理的从他们身上恢复的方法.这当然有点主观.
它们可以被处理,但你没有必要.如果你不处理它们,它们将传播并爬上调用方法堆栈,直到其中一个捕获它.如果没有,程序将崩溃.
通常,底线是如果可以合理地期望客户端从异常中恢复,那么它应该是一个经过检查的异常.如果客户端无法执行任何操作以从异常中恢复,则可以将其作为未经检查的异常.
此外,已检查的异常对于记录您希望第三方使用的API非常有用.当他们知道你的方法可以抛出一个特定的异常时,他们会相应地编码并处理这个案例.如果您只使用未经检查的例外,则所有投注均已关闭.
一种常见的模式(有些人不喜欢它,但在某些情况下,当你知道自己在做什么时它是可以的)就是将抛出的已检查异常包装到未经检查的模式中.
try {
   ... code that can throw CheckedException ...
} catch (CheckedException oopsSomethingBadHappened) {
    throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened);
}