在教程中,我发现您的代码无法处理未经检查的异常,即我们无法使用try/catch
块,示例是ArrayIndexOutOfBoundsException, NullPointerException.
之类的例外但是可以使用try / catch块处理这些异常。我想我不清楚这个概念!!
另外我认为throw关键字只能用于try/catch
block.can throw关键字与UncheckedException
一起使用?
答案 0 :(得分:32)
已检查和未检查的异常之间的唯一区别是已检查的已使用throws
在方法签名中捕获或声明了,而对于未经检查的异常,这是可选的。
您的代码无法处理未经检查的异常,即我们无法使用try / catch块
当然可以 - 但我们没有。
另外我认为throw关键字只能用于try / catch block.can throw关键字可以与Unchecked Exception一起使用吗?
请注意,有两个关键字:
throw
显式抛出您创建的异常对象。 throw new NullPointerException();
工作得非常好,虽然明确地创建了这个特殊的异常并不常见,但大多数人会认为它很糟糕。throws
声明方法可能抛出该异常。使用未经检查的异常,这是可选的,但是可以用来记录事实(同样,通常不会声明throws NullPointerException
,因为这几乎是给定的。)答案 1 :(得分:6)
所有未经检查的异常都可以像检查的那样处理 - 如果需要,可以通过声明方法throws
来让它们通过:
public void m() throws RuntimeException {}
或者你可以catch
他们:
public void m() {
try {
// some code
} catch (RuntimeException re) {
// do something
}
}
应该注意,类RuntimeException
充当未经检查的异常的全部(因为所有未经检查的异常都从它扩展),就像Exception
类是一样的检查异常的全部内容。
如前所述,唯一真正的区别在于,对于已检查的异常,您有来处理它们(通过让它们通过或捕获它们)并且编译器将确保它 - 在另一方面,未经检查的例外的处理是可选的。
这一切都归结为每种异常类型的预期用法 - 你应该能够从已检查的异常中恢复(或至少在它们发生时对它们做些什么),而对于未经检查的异常,可能没有从他们身上恢复是一种合理的方式。这当然有点主观。
答案 2 :(得分:5)
他们可以处理,但你不得。如果你不处理它们,它们将传播并爬上调用方法堆栈,直到其中一个捕获它。如果没有,程序将崩溃。
通常,最重要的是,如果可以合理地期望客户端从异常中恢复,那么它应该是已检查的异常。如果客户端无法执行任何操作以从异常中恢复,则可以将其作为未经检查的异常。
此外,已检查的例外对于记录您希望第三方使用的API非常有用。当他们知道你的方法可以抛出一个特定的异常时,他们会相应地编码并处理这个案例。如果您只使用未经检查的例外,则所有投注均已关闭。
一种常见的模式(有些人不喜欢它,但在某些情况下,当你知道自己在做什么时它是可以的)是将抛出的已检查异常包装到未经检查的模式中。
try {
... code that can throw CheckedException ...
} catch (CheckedException oopsSomethingBadHappened) {
throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened);
}
答案 3 :(得分:3)
考虑差异的一种简单方法是认为检查是指编译。如果异常是已检查的异常,编译器将检查您的代码是否抛出异常或在编译时在try / catch块中处理它。对于未经检查的异常,编译器不会进行此类检查。您可以以相同的方式处理已检查/未检查的异常(使用try / catch / throws),区别仅在于编译器执行的检查。这篇文章有一个不错的example。
答案 4 :(得分:3)
除了纪尧姆:
答案 5 :(得分:0)
是的,您可以使用throw
投放未经检查的例外。是的,您可以在catch
块中捕获未经检查的异常。
答案 6 :(得分:0)
是的,您可以处理未检查的异常,但不是强制性的。实际上,它取决于应用程序开发人员。以下是我认为甚至需要处理未经检查的异常的可能原因。
如果您的应用程序很大,许多开发人员正在互相调用API。最好处理未检查的异常,否则最终您的程序将崩溃,从而停止其他功能。因此,即使是简单的NullPointerException也可以使您的程序停止工作。
假设您有一个调度程序,该调度程序处理用户数据且大小为百万,对于坏数据,您只想打印日志而不停止处理其他好数据。在这种情况下,如果您没有处理异常,则一个错误的数据可能会停止您的程序
答案 7 :(得分:-3)
是的,我们可以处理运行时异常,请检查下面的代码
public class Demo {
static void m1() {
int a[]=new int [5];
try {
a[12]=2;
}catch(Exception e) {
}
}
public static void main(String[] args) {
m1();
try {
String s=null;
System.out.println(s.length());
}catch(Exception e) {
}
System.out.println("hello world");
}
}