阅读有关本book例外,我发现这样的说法:检查和未检查异常在Java中如何工作?
经过异常是由在编译时,编译器检查。
和
编译器不检查在编译时未检查异常。
所以,如果我们也可以说,IOException
或SQLException
是检查异常分类如下。 java编译器怎么知道会有一个例外,没有为IllegalArgumentException
这威力保持里面的代码是我的理解。
此外,究竟是被强制性取得Checked异常并且不是Unchecked意味着什么?
阅读有关本book例外,我发现这样的说法:检查和未检查异常在Java中如何工作?
经过异常是由在编译时,编译器检查。
和
编译器不检查在编译时未检查异常。
所以,如果我们也可以说,IOException
或SQLException
是检查异常分类如下。 java编译器怎么知道会有一个例外,没有为IllegalArgumentException
这威力保持里面的代码是我的理解。
此外,究竟是被强制性取得Checked异常并且不是Unchecked意味着什么?
java中的异常都以同样的方式工作。
如果调用该方法的方法抛出一个检查异常的方法必须尝试/捕获该异常,或者将自己的方法声明为引发该异常,则检查和未检查异常(它们都是RuntimeException的所有子类)之间的区别。
所以,如果我有一个方法:
void throwsACheckedException() throws SomeCheckedException;
谁要求它必须做的两件事情之一。或者:
try {
throwsACheckedException();
} catch (SomeCheckedException e) {
//do something
}
或
void someCallingMethod() throws SomeCheckedException { //pass it on
throwsACheckedException();
}
unchecked异常你没有申报,谁就调用方法没有明确地赶上。例如:
void someInnocentLookingMethod() {
throw new NullPointerException("surprise!"); //...extends RuntimeException
}
,然后你可以简单地调用它,没有的try/catch麻烦:
void unsuspectingVictim() {
someInnocentLookingMethod();
}
unchecked异常通常用于东西,可以在任何时候等你爬起来迫使开发人员尝试/捕捉它们会使代码非常繁琐(例如,NullPointerException),尽管有些人检查异常完全是邪恶的:-)
检查的异常要求您向方法签名添加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();
}
而且,只是为了完整起见,办法确定从检查的异常未经检查的是unchecked异常从RuntimeException
所有下降在某一点或其他。
如果在匹配的'try'块中包含异常源(抛出'语句或调用引发异常的方法),则不必为方法签名添加'throws'声明catch条款。 –
谢谢@TedHopp。更新了答案。 – yamafontes
对于检查异常,您会看到编译时出错,并说你必须处理th EM。 运行时异常不会提供任何错误或警告来处理您的代码。
编译器期望异常(检查异常)并要求您处理它。
忘记所有答案并阅读[Java语言规范的这一章](http://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html#jls-11.1.1 )。 –
非常有用,谢谢。为什么我应该忘记答案?你真的认真吗? – diegoaguilar
答案对于理解高水平是很好的。 JLS给你绝对的真相。 –