Java提供了兩類(lèi)主要的異常:runtime exception和checked exception。所有的checked exception是從java.lang.Exception類(lèi)衍生出來(lái)的,而runtime exception則是從java.lang.RuntimeException或java.lang.Error類(lèi)衍生出來(lái)的。
它們的不同之處表現(xiàn)在兩方面:機(jī)制上和邏輯上。
一、機(jī)制上
它們?cè)跈C(jī)制上的不同表現(xiàn)在兩點(diǎn):1.如何定義方法;2. 如何處理拋出的異常。請(qǐng)看下面CheckedException的定義:
public class CheckedException extends Exception
{
public CheckedException() {}
public CheckedException( String message )
{
super( message );
}
}
以及一個(gè)使用exception的例子:
public class ExceptionalClass
{
public void method1()
throws CheckedException
{
// ... throw new CheckedException( "...出錯(cuò)了" );
}
public void method2( String arg )
{
if( arg == null )
{
throw new NullPointerException( "method2的參數(shù)arg是null!" );
}
}
public void method3() throws CheckedException
{
method1();
}
}
你可能已經(jīng)注意到了,兩個(gè)方法method1()和method2()都會(huì)拋出exception,可是只有method1()做了聲明。另外,method3()本身并不會(huì)拋出exception,可是它卻聲明會(huì)拋出CheckedException。在向你解釋之前,讓我們先來(lái)看看這個(gè)類(lèi)的main()方法:
public static void main( String[] args )
{
ExceptionalClass example = new ExceptionalClass();
try
{
example.method1();
example.method3();
}
catch( CheckedException ex ) { } example.method2( null );
}
在main()方法中,如果要調(diào)用method1(),你必須把這個(gè)調(diào)用放在try/catch程序塊當(dāng)中,因?yàn)樗鼤?huì)拋出Checked exception。
相比之下,當(dāng)你調(diào)用method2()時(shí),則不需要把它放在try/catch程序塊當(dāng)中,因?yàn)樗鼤?huì)拋出的exception不是checked exception,而是runtime exception。會(huì)拋出runtime exception的方法在定義時(shí)不必聲明它會(huì)拋出exception。
現(xiàn)在,讓我們?cè)賮?lái)看看method3()。它調(diào)用了method1()卻沒(méi)有把這個(gè)調(diào)用放在try/catch程序塊當(dāng)中。它是通過(guò)聲明它會(huì)拋出method1()會(huì)拋出的exception來(lái)避免這樣做的。它沒(méi)有捕獲這個(gè)exception,而是把它傳遞下去。實(shí)際上main()方法也可以這樣做,通過(guò)聲明它會(huì)拋出Checked exception來(lái)避免使用try/catch程序塊(當(dāng)然我們反對(duì)這種做法)。
小結(jié)一下:
* Runtime exceptions:
在定義方法時(shí)不需要聲明會(huì)拋出runtime exception;
在調(diào)用這個(gè)方法時(shí)不需要捕獲這個(gè)runtime exception;
runtime exception是從java.lang.RuntimeException或java.lang.Error類(lèi)衍生出來(lái)的。
* Checked exceptions:
定義方法時(shí)必須聲明所有可能會(huì)拋出的checked exception;
在調(diào)用這個(gè)方法時(shí),必須捕獲它的checked exception,不然就得把它的exception傳遞下去;
checked exception是從java.lang.Exception類(lèi)衍生出來(lái)的