java異常處理try/catch/finally
/**
* 異常處理 try catch finally
*/
public class Test02 {
? ?public static void main(String[] args) {
// ? ? ? ?FileReader reader = new FileReader("c:/Unhandled exception:java.io.FileNotFoundException");
? ? ? ?//直接調(diào)用reader會(huì)拋出異常checkedException 提示未處理 未發(fā)現(xiàn)文件異常 即讀取文件時(shí)可能出現(xiàn)找不到該文件的情況
? ? ? ?// 需要將reader操作try包起來(lái)并且catch可能會(huì)出現(xiàn)的FileNotFoundException并通過(guò)catch后的{}語(yǔ)句塊進(jìn)行處理
// ? ? ? ?char c1 = (char) reader.read();
? ? ? ?//FileReader類對(duì)象.read()會(huì)讀取一個(gè)字符并返回字符對(duì)應(yīng)的int數(shù)值 需要強(qiáng)轉(zhuǎn)char變回字符
? ? ? ?//checkedException檢查異常 Unhandled exception:java.io.IOException 未處理io異常 同樣需要try包裹后catch(io異常)處理
// ? ? ? ?char c2 = (char) reader.read();
? ? ? ?//第二次read()會(huì)再往后讀取一個(gè)字符 第n次read()會(huì)讀第n個(gè)字符
// ? ? ? ?reader.close();
? ? ? ?//調(diào)用reader讀取后操作系統(tǒng)會(huì)一直保持開(kāi)啟讀取狀態(tài),調(diào)用完成后需要手動(dòng)將reader關(guān)閉來(lái)釋放
? ? ? ?//close()同樣報(bào)io異常 需要try catch包裹處理
? ? ? ?FileReader reader = null;
? ? ? ?//main方法內(nèi)需要手動(dòng)初始化
? ? ? ?try{
? ? ? ? ? ?reader = new FileReader("c:/a.txt");
? ? ? ? ? ?//catch FileNotFoundException
? ? ? ? ? ?char c1 = (char) reader.read();
? ? ? ? ? ?//catch IOException
? ? ? ? ? ?char c2 = (char) reader.read();
? ? ? ?}catch(FileNotFoundException e){
? ? ? ? ? ?//需要導(dǎo)入
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}catch (IOException e){
? ? ? ? ? ?//可以多個(gè)catch 應(yīng)對(duì)不同的異常情況
? ? ? ? ? ?//FileNotFoundException extends繼承 IOException 如果先catch io的話new FileReader的異常也會(huì)走io的語(yǔ)句塊處理
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}finally{
? ? ? ? ? ?//無(wú)論是否出現(xiàn)異常 在try catch執(zhí)行后都會(huì)執(zhí)行finally語(yǔ)句塊 如果try中第一句就報(bào)異常 第一句后面的語(yǔ)句會(huì)被跳過(guò) 針對(duì)這個(gè)異常執(zhí)行catch 之后執(zhí)行finally try中沒(méi)有執(zhí)行的語(yǔ)句不會(huì)返回來(lái)執(zhí)行完
// ? ? ? ? ? ?reader.close();
? ? ? ? ? ?//如果在try{}中聲明FileReader reader 出了try語(yǔ)句塊reader會(huì)失效 需要在try之前聲明 finally中的語(yǔ)句并沒(méi)有被try包裹 close()依然報(bào)未處理io異常
? ? ? ? ? ?try{
? ? ? ? ? ? ? ?reader.close();
? ? ? ? ? ?}catch(IOException e){
? ? ? ? ? ? ? ?//這里盡管close()自動(dòng)提示處理io異常 但如果沒(méi)有c:/a.txt的話reader就沒(méi)有得到new FileReader對(duì)象 在reader為null的情況下.close()會(huì)報(bào)空指針異常NullPointerException
? ? ? ? ? ? ? ?//NullPointerException extends RuntimeException extends Exception
? ? ? ? ? ? ? ?//IOException extends Exception 這兩種異常在繼承樹(shù)中不相干 只catch io異常依然不能滿足異常處理
? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ?}catch (NullPointerException e){
? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? ? ?//這樣所有異常都處理完畢 雖然沒(méi)能讀取到文件 但是程序完整的跑完了 exit code 0 正常退出
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?//close()的try catch包在finally中 到這里finally結(jié)束
? ?}
}