Java 中使用 try-catch 或 try-catch-finally 來捕獲並處理異常。
一、關於try - catch
基本文法
try{ // 需要被檢測的代碼}catch(異常類 變數){ // 處理方式}
如果try塊中的代碼拋出異常會發生什麼呢。拋出異常的方法終止執行,程式的控制權將被移交給catch塊中的例外處理常式,那麼catch塊中的代碼如何寫呢。可以發出一些警告提醒使用者或者編程人員去檢查一些配置,以及網路連接,也可以在catch語句塊中進行錯誤記錄檔的記錄等 。但是,如果沒發生異常,catch 代碼塊不會被執行。
如何捕獲異常程式碼範例(單一類型異常):
try{ System.out.println("請輸入你的年齡:"); Scanner scanner = new Scanner(System.in); int age = scanner.nextInt(); System.out.println("十年後你的年齡是:"+age+10); }catch(InputMismatchException e){ System.out.println("你應該輸出整數!!"); } System.out.println("程式結束啦");
測試結果:
請輸入你的年齡:15.2你應該輸出整數!!程式結束啦
注意: 在try-catch塊執行完畢後,在其後面的代碼也會繼續執行。
如何捕獲異常程式碼範例(多種類型異常): 多個catch塊分別捕獲多種類型的異常。
try{ Scanner input = new Scanner(System.in); System.out.println("請輸出第一個數:"); int one = input.nextInt(); System.out.println("請輸出第二個數:"); int two = input.nextInt(); System.out.println("兩數相除的結果為:"+one/two); // 輸入不匹配異常 }catch (InputMismatchException e){ System.out.println("你應該輸入整數"); // 算術異常 }catch (ArithmeticException e){ System.out.println("除數不能為0"); } catch (Exception e){ System.out.println("未知名錯誤"); } System.out.println("程式運行結束了");
測試結果 :
請輸出第一個數:10請輸出第二個數:0除數不能為0程式運行結束了
編寫多重catch塊遵循: 先具體、後一般(先子類後父類)
這是因為當發生異常時,異常處理系統會就近尋找匹配的例外處理常式,而子類繼承於父類,針對於父類的例外處理常式對於子類也是適用的。
二、關於 try-catch-finally
基本文法
try{//一些會拋出異常的方法}catch(Exception e){//處理該異常的代碼塊}catch(Exception 2e){//處理該異常的代碼塊}...(n個catch塊)...{...}finally{//最終將要執行的代碼}
不管程式有無發生異常 ,都將執行finally語句塊中的內容,這使得不管在任何情況下都必須執行的步驟被執行,這樣可以保證程式的健壯性。
看個finally的例子,定義如下方法
/** * divider(除數) * result (結果) * try-catch不會while迴圈 * 每次迴圈,divider 減1,result = result +100/divider * 如果: 捕獲異常,列印輸出,拋出異常了,並返回999 * 否則,返回resul * finally : 這是finally,同時列印輸出result的值 * */ public int test2(){ int divider = 10; int result = 100; try{ while(divider > -1){ divider--; result = result +100/divider; } return result; }catch(Exception e){ // 將該異常的跟蹤棧資訊輸出到標準錯誤輸出 e.printStackTrace(); System.out.println("拋出異常了"); return result = 999; }finally{ System.out.println("這是finally,result的值="+result); } }
輸出結果:
注意 :
1) try-catch-finally 中的finally語句塊,是在try和catch語句塊中的rerutrn語句執行完成之後,返回到調用者之前會去執行的
2)如果try-catch-finally 之內沒有任何的return語句,則會調用者3個語句塊之外的語句
3) fially 語句塊一般 放一些 釋放資源的代碼。例如 : 操作資料時發生異常後,在finally 關閉資料庫連接
三、訪問異常資訊
如果Java應用程式要在catch塊中訪問異常對象的相關資訊,則可以通過調用catch有異常形參的方法來獲得。
在Java中所有的異常對象都包含如下常用的方法:
1、getMessage(): 返回該異常的詳細描述字串
例如 : / by zero
2、toString() 異常名字 : 異常資訊
例如 : java.lang.ArthmeticException : / by zero
2、printStackTrace() : 將該異常的跟蹤棧資訊輸出到標準錯誤輸出 包括 : 異常名稱、異常資訊、異常出現位置 這個方法的傳回值 是void。
其實jvm預設的異常處理機制,就是在調用printStackTrace(),列印異常的堆疊追蹤資訊
例如 :
java.lang.ArithmeticException: / by zero at com.lemon.FinallyTest.test2(FinallyTest.java:54) at com.lemon.FinallyTest.main(FinallyTest.java:119)
demo地址 : http://download.csdn.net/download/qq_18505715/9865121