標籤:
【異常】
<1>運行期出現的錯誤(不是編譯時間的語法錯誤)。 <2>觀察錯誤的名字和行號很重要! 【程式分析:數組越界】 int [] arr = {1,2,3}; System.out.println(arr[4]); 註:在C和C++中編譯通過,因為在C和C++中不進行數組越界的檢查(這就很容易造成緩衝區溢位漏洞)。 Java可以檢查數組下標是否越界,但是有一定的檢查範圍。 報錯:Exception in thread ‘main‘ java.lang.ArrayIndexOutOfBoundsException: 4[出錯的下標]at ***(出錯位置) ----數組下標越界 【程式分析:分母為0】 System.out.println(2/0); 報錯:Exception in thread ‘main‘ java.lang.ArithmaticException: by zero at *** 解決:捕獲異常 try{ System.out.println(2/0); }catch(ArithmaticException ae){ //Java程式在出錯時,ae對象是可以直接使用的,以內預設情況下已經初始化 System.out.println("系統維護中..."); //這是很多網站常用的提示,因此持續重新整理並不能解決問題 ae.printStackTrace(); //這是常用的解決方式,即把錯誤的堆棧資訊列印出來(把引起錯誤的所有資訊列印,這樣便於程式員進行調試) } 【程式】 <1>查看API文檔可知,每種方法都會有對應的Exception,意在提醒使用者在使用該方法時要格外注意該異常的出現,可以使用 throw Exception語句解決;還有一種異常直接在方法聲明中就給出,例如public int read() throws IOException{}。<2>在方法定義時,使用throws關鍵字拋出可能的異常;在調用該方法時,使用try-catch語句捕獲異常。<3>throw的用法: void A(int i) throws ArithmaticException{ if(i==0){ throw new ArithmaticException("被除數不能為0"); //這相當於一個錯誤列印語句 } } 【異常分類】 <1>所有的異常均來自這樣一個類:Throwable(java.lang.Throwable其有兩個子類--Error、Exception)。<2>Exception是可以初始化的異常,其中還有一個比較特殊的異常:RuntimeException。<3>Throwable意為"可拋出的",只要從該類繼承的對象,都是可以拋出異常。<4>Error是系統級錯誤,即虛擬機器錯誤,我們使用者無法處理;Exception可以由使用者處理。<5>RuntimeException是經常出現的錯誤,可以不進行處理;另外一種Exception(不是運行時的Exception)必須進行捕獲並處理(JDK中有些方法後面直接寫出throws的即代表必須處理的異常)。 【Exception分類】
【finally】 工作原理: 存在的必要性:如果前面執行開啟檔案操作,當操作出錯時,對應的代碼不會繼續執行,但是我們必須要把開啟的檔案關閉,這段代碼就需要放置在finally代碼塊中。 【try】 【catch】 【finally】 樣本程式: 【異常的拋出和處理】 程式:void f() throws FileNotFoundException,IOException{ //比較嚴格的是拋出多種可能的異常,可以根據實際捕獲的異常作出不同的處理 FileInputStream in = new FileInputStream("**.txt"); int b; b = in.read(); while(b == -1){ System.out.println((char)b); b = in.read(); } } void f2(){ try{ f(); catch(FileNotFoundException e){ e.getMessage(); //必須要對Exception作出相應的處理,否則就相當於把Exception認為吞併了 }catch(IOException e){ e.printStackTrace(); } }} void f2() throws IOException{ f(); }//捕獲異常後不知道怎麼處理,可採用上述方法。註:如果任何異常都不想處理,也可以在main函數上直接拋出異常,這時拋出的異常是交給Java運行系統。除了在做測試意外,實際編程中不要在main函數中拋出異常。 【Exception舉例】 註:這裡要特別注意出錯的行號(極其重要--說明哪個方法在哪個地方出的錯),這時往往是由於其中一個地方錯誤引起的。 註:Exception應該放在後面,不能置於其子類的前面。報錯:已捕獲到異常 java.io.FileNotFoundException **** 【自訂異常】 在實際項目中往往需要自己定義需要的異常類,從已存在的類(RuntimeException等)繼承即可。 步驟: 【舉例】 【注意】 註:<1>第一個拋出的異常類型和原來的不一致,應該為IOException。 <2>第二個拋出的範圍大了(範圍大了小了都不可以)。 <3>第三個不拋異常可以重寫方法。 <4>第四個拋出異常多了。
Java——異常處理