4.1 什么是例外
例外就是在程序的運(yùn)行過(guò)程中所發(fā)生的異常事件,它中斷指令的正常執(zhí)行。Java中提供了一種獨(dú)特的處理例外的機(jī)制,通過(guò)例外來(lái)處理程序設(shè)計(jì)中出現(xiàn)的錯(cuò)誤。
4.1.1 例外示例
【例4-1】
import java.io.*;
class ExceptionDemo1{
public static void main( String args[ ] ){
FileInputStream fis = new FileInputStream( "text" );
int b;
while( (b=fis.read())!=-1 ){
System.out.print( b );
}
fis.close( );
}
}
查看編譯結(jié)果
【例4-2】
class ExceptionDemo2{
public static void main( String args[ ] ){
int a = 0;
System.out.println( 5/a );
}
}
運(yùn)行結(jié)果
C:\>javac ExceptionDemo2.java
C:\>java ExceptionDemo2
java.lang.ArithmeticException: / by zero at
ExceptionDemo2.main(ExceptionDemo2.java:4)
因?yàn)槌龜?shù)不能為0,所以在程序運(yùn)行的時(shí)候出現(xiàn)了除0溢出的異常事件。為什么有的例外在編譯時(shí)出現(xiàn),而有的例外是在運(yùn)行時(shí)出現(xiàn)的?讓我們繼續(xù)學(xué)習(xí)java 的例外處理機(jī)制。
4.1.2 例外處理機(jī)制
拋棄(throw)例外:
在Java程序的執(zhí)行過(guò)程中,如果出現(xiàn)了異常事件,就會(huì)生成一個(gè)例外對(duì)象。生成的例外對(duì)象將傳遞給Java運(yùn)行時(shí)系統(tǒng),這一例外的產(chǎn)生和提交過(guò)程稱(chēng)為拋棄(throw)例外
兩種處理例外的機(jī)制:
◇ 捕獲例外:
當(dāng)Java運(yùn)行時(shí)系統(tǒng)得到一個(gè)例外對(duì)象時(shí),它將會(huì)沿著方法的調(diào)用棧逐層回溯,尋找處理這一例外的代碼。找到能夠處理這種類(lèi)型的例外的方法后,運(yùn)行時(shí)系統(tǒng)把當(dāng)前例外對(duì)象交給這個(gè)方法進(jìn)行處理,這一過(guò)程稱(chēng)為捕獲(catch)例外。這是積極的例外處理機(jī)制。如果Java運(yùn)行時(shí)系統(tǒng)找不到可以捕獲例外的方法,則運(yùn)行時(shí)系統(tǒng)將終止,相應(yīng)的Java程序也將退出。
◇ 聲明拋棄例外:
如果一個(gè)方法并不知道如何處理所出現(xiàn)的例外,則可在方法聲明時(shí),聲明拋棄(throws)例外。這是一種消極的例外處理機(jī)制。
例外就是在程序的運(yùn)行過(guò)程中所發(fā)生的異常事件,它中斷指令的正常執(zhí)行。Java中提供了一種獨(dú)特的處理例外的機(jī)制,通過(guò)例外來(lái)處理程序設(shè)計(jì)中出現(xiàn)的錯(cuò)誤。
4.1.1 例外示例
【例4-1】
import java.io.*;
class ExceptionDemo1{
public static void main( String args[ ] ){
FileInputStream fis = new FileInputStream( "text" );
int b;
while( (b=fis.read())!=-1 ){
System.out.print( b );
}
fis.close( );
}
}
查看編譯結(jié)果
【例4-2】
class ExceptionDemo2{
public static void main( String args[ ] ){
int a = 0;
System.out.println( 5/a );
}
}
運(yùn)行結(jié)果
C:\>javac ExceptionDemo2.java
C:\>java ExceptionDemo2
java.lang.ArithmeticException: / by zero at
ExceptionDemo2.main(ExceptionDemo2.java:4)
因?yàn)槌龜?shù)不能為0,所以在程序運(yùn)行的時(shí)候出現(xiàn)了除0溢出的異常事件。為什么有的例外在編譯時(shí)出現(xiàn),而有的例外是在運(yùn)行時(shí)出現(xiàn)的?讓我們繼續(xù)學(xué)習(xí)java 的例外處理機(jī)制。
4.1.2 例外處理機(jī)制
拋棄(throw)例外:
在Java程序的執(zhí)行過(guò)程中,如果出現(xiàn)了異常事件,就會(huì)生成一個(gè)例外對(duì)象。生成的例外對(duì)象將傳遞給Java運(yùn)行時(shí)系統(tǒng),這一例外的產(chǎn)生和提交過(guò)程稱(chēng)為拋棄(throw)例外
兩種處理例外的機(jī)制:
◇ 捕獲例外:
當(dāng)Java運(yùn)行時(shí)系統(tǒng)得到一個(gè)例外對(duì)象時(shí),它將會(huì)沿著方法的調(diào)用棧逐層回溯,尋找處理這一例外的代碼。找到能夠處理這種類(lèi)型的例外的方法后,運(yùn)行時(shí)系統(tǒng)把當(dāng)前例外對(duì)象交給這個(gè)方法進(jìn)行處理,這一過(guò)程稱(chēng)為捕獲(catch)例外。這是積極的例外處理機(jī)制。如果Java運(yùn)行時(shí)系統(tǒng)找不到可以捕獲例外的方法,則運(yùn)行時(shí)系統(tǒng)將終止,相應(yīng)的Java程序也將退出。
◇ 聲明拋棄例外:
如果一個(gè)方法并不知道如何處理所出現(xiàn)的例外,則可在方法聲明時(shí),聲明拋棄(throws)例外。這是一種消極的例外處理機(jī)制。