阅读本book中的例外情况,我发现了这句话:
编译器在编译时检查已检查的异常。
和
编译器在编译时不检查未经检查的异常。
因此,如果我们也可以说IOException
或SQLException
低于Checked Exceptions类树。 java编译器如何知道 是一个例外而不是IllegalArgumentException
的 可能 保持代码内部作为我的理解。
此外,确保获得Checked异常并且不是针对Unchecked的强制性事实是什么意思?
答案 0 :(得分:4)
已检查的异常要求您向方法签名添加throws
声明,或者在其周围添加try
catch
块。
public void checked() throws IOException {
throw new IOException(); // compiles just fine
}
public void checked() {
try {
throw new IOException();
} catch (IOException e) {
// ...
}
}
这不起作用:
public void checkedWithoutThrows() {
throw new IOException(); // will not compile
}
未经检查的异常不需要此。
public void unchecked() {
throw new RuntimeException();
}
而且,为了完整起见,确定未经检查的异常的方法是未经检查的异常都会在某个时刻从RuntimeException
下降。
答案 1 :(得分:3)
异常都以相同的方式工作
已检查和未检查的异常(它们都是RuntimeException的子类)之间的区别如果对于抛出已检查异常的方法,无论何人调用该方法都必须尝试/捕获异常,或者将自己的方法声明为抛出异常异常。
所以,如果我有一个方法:
void throwsACheckedException() throws SomeCheckedException;
无论谁调用它都必须做两件事之一。之一:
try {
throwsACheckedException();
} catch (SomeCheckedException e) {
//do something
}
或
void someCallingMethod() throws SomeCheckedException { //pass it on
throwsACheckedException();
}
您不必声明的未经检查的异常,并且调用该方法的任何人都不必显式捕获。例如:
void someInnocentLookingMethod() {
throw new NullPointerException("surprise!"); //...extends RuntimeException
}
然后你可以简单地调用它,而不需要try / catch麻烦:
void unsuspectingVictim() {
someInnocentLookingMethod();
}
未经检查的异常通常用于任何可能随时出现的事情,因此强制开发人员尝试/捕获它们会使代码非常繁琐(例如NullPointerException),尽管有些事情检查了异常是邪恶完全: - )
答案 2 :(得分:2)
对于Checked异常,您在编译时看到错误,并表示您必须处理它们。 运行时异常不会在代码中处理任何错误或警告。
编译器需要异常(Checked exceptions)并要求您处理它。