標籤:
1:異常(Exception)的概念
Java異常時Java提供的用於處理常式中錯誤的一種機制
2:處理方式
Java是採用物件導向的方式來處理異常的。
- 拋出異常:在執行一個方法是,如果發生異常,則這個方法產生代表該異常的一個對象,停止當前執行路徑,並把異常對象提交給JRE
- 捕獲異常:JRE得到該異常後,尋找相應的代碼來處理該異常,JRE在方法的調用棧尋找,從產生的異常方法中開始回溯,直到找到相應的異常處理代碼為止。
3:異常分類:
JDK中定義了很多異常類,這些類對應了各種各樣可能出現的例外狀況事件,所有異常對象都是派生於Thorwable類的一個執行個體。如果內建的異常類不能夠滿足需要,還可以建立自己的異常類
Error(錯誤)類 --- 不需要我們管 --- 唯一的辦法:重啟
Exception 中 Checked Exception是編譯器會檢查的
RuntimeException編譯器不會檢查,比如:
1:int a = 1/0;
2: null 指標異常(NullPointerException):,一般是對象為空白
3:數組越界(ArrayIndexOutOfBoundsException)
4:對象轉化出錯(ClassCastException) 可以想判斷 e.g: obj instanceof
5:數字格式異常(NumberFormatException)
e.g String str = "153153ag";
Integer i = new Integer(str);
4:異常的處理辦法第一種: 捕獲異常(try catch finally)
try:
- 一個try語句必須帶有至少一個catch語句塊或一個finally語句塊..
- 當異常處理的代碼執行結束以後,是不會回到try語句去執行尚未執行的代碼
catch:
- 每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同類型的異常對象
- 常用方法:
toString()方法:顯示異常的類名和產生異常的原因
getMessage()方法: 只顯示產生異常的原因,但不顯示類名。
PrintStackTrace()方法: 用來跟蹤例外狀況事件發生時堆棧的內容。
-- 這些方法均繼承自Throwable類
- 如果異常類之間有繼承關係,在順序安排上需注意,越是頂層的類,越放在下面,再不然就直接把多餘的catch省略掉
finally
- 通常在finally中關閉程式塊已開啟的資源,比如:檔案流,釋放資料庫連接等。
執行個體:
檔案操作:
這個問題是因為檔案可能不存在
代碼:
import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class TestFileReader { public static void main(String args[]) { FileReader reader = null; try { reader = new FileReader("d:/lp.txt"); char c = (char) reader.read(); char c2 = (char) reader.read(); System.out.println("" + c + c2); } catch (FileNotFoundException e) { e.printStackTrace(); } //這裡的兩個catch不能換位置 因為IOException是FileNotFoundException的父類 catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }}檔案操作
try - catch - finally - return 的執行順序:
代碼:
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class TestFileReader { public static void main(String args[]) { String str = new TestFileReader().openFile(); System.out.println(str); } private String openFile() { System.out.println("aaa"); try { FileInputStream fis = new FileInputStream("d:/lp.txt"); int a = fis.read(); System.out.println("bbb"); return "step1"; } catch (FileNotFoundException e) { System.out.println("catching!!"); e.printStackTrace(); return "step2"; } catch (IOException e) { e.printStackTrace(); return "step3"; }finally{ System.out.println("finally"); } } }無異常代碼
結果:
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class TestFileReader { public static void main(String args[]) { String str = new TestFileReader().openFile(); System.out.println(str); } private String openFile() { System.out.println("aaa"); try { FileInputStream fis = new FileInputStream("d:/wu.txt"); int a = fis.read(); System.out.println("bbb"); return "step1"; } catch (FileNotFoundException e) { System.out.println("catching!!"); e.printStackTrace(); return "step2"; } catch (IOException e) { e.printStackTrace(); return "step3"; }finally{ System.out.println("finally"); } } }有異常代碼
結果:
結論:1:執行try catch 給傳回值賦值
2:執行finally
3:return
5:異常處理辦法第二種: throws字句
Java中的異常處理