2013-10-17 81 views
0

阅读有关本book例外,我发现这样的说法:检查和未检查异常在Java中如何工作?

经过异常是由在编译时,编译器检查。

编译器不检查在编译时未检查异常。

所以,如果我们也可以说,IOExceptionSQLException是检查异常分类如下。 java编译器怎么知道会有一个例外,没有为IllegalArgumentException威力保持里面的代码是我的理解。

此外,究竟是被强制性取得Checked异常并且不是Unchecked意味着什么?

+1

忘记所有答案并阅读[Java语言规范的这一章](http://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html#jls-11.1.1 )。 –

+0

非常有用,谢谢。为什么我应该忘记答案?你真的认真吗? – diegoaguilar

+1

答案对于理解高水平是很好的。 JLS给你绝对的真相。 –

回答

3

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),尽管有些人检查异常完全是邪恶的:-)

4

检查的异常要求您向方法签名添加throws声明,或者在其周围添加一个trycatch块。

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所有下降在某一点或其他。

+0

如果在匹配的'try'块中包含异常源(抛出'语句或调用引发异常的方法),则不必为方法签名添加'throws'声明catch条款。 –

+0

谢谢@TedHopp。更新了答案。 – yamafontes

2

对于检查异常,您会看到编译时出错,并说你必须处理th EM。 运行时异常不会提供任何错误或警告来处理您的代码。

编译器期望异常(检查异常)并要求您处理它。