生活随笔
收集整理的這篇文章主要介紹了
Java中异常机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概述
異常是一套用于反饋和處理問題的機制Throwable 是所有異常和錯誤的頂級父類Throwable派生出兩個類Error和Exeption 二、Error
出現在代碼邏輯沒有錯誤,因外界因素或環境因素導致的嚴重錯誤的情況。一旦出現,無法修改
三、Exception
-異常,代表了程序在編譯和運行時發生的各種不期望發生的事件。是java異常處理的核心。非檢查是異常(運行時異常): -編譯時不會報錯,運行時報錯,往往是語法正確,但是邏輯錯誤。?編譯前可以處理,也可以不處理。一個小的父類 --- RuntimeException 檢查異常(編譯時異常): 編譯時已經出現,一旦出現,則必須處理要么拋出,要么捕獲 四、異常的捕獲
public static void main(String[] args) {// System.out.println(1 / 0);try {int[] arr = new int[3];System.out.println(arr[5]);} catch (ArrayIndexOutOfBoundsException e) {System.out.println();}}
多個異常可以同時處理,用多個catch捕獲如果所有異常的處理方式都一樣,可以用統一的Exception一次捕獲多個異常分組處理,在同一組異常之間可以用"|"隔開。(從JDK1.7開始)try {String msg = readFile(null);System.out.println(msg);} catch (PathNotExistException | FileCannotReadException e) {// 打印棧軌跡e.printStackTrace();// System.out.println(e.getMessage());} catch (Exception e) {} finally {System.out.println("文件釋放");}
如果方法拋出的是父類異常,則必須要一以父類異常捕獲在捕獲異常 時,要求先捕獲子類異常,在捕獲父類異常。否則子類異常將永遠無法捕獲到。 五、排查異常
查看異常的名字查看異常信息從棧軌跡尾端開始看起(控制臺從上至下)。 注意:如果異常最終拋給了JVM,那么JVM默認打印 這個異常的棧軌跡。
六、異常的自定義
當一個類繼承Exception,則默認是編譯時異常當一個類繼承RuntimeException時,才是運行是異常。一個類繼承運行時異常類,那么這個類就是運行時異常;反之,則為編譯時異常。 public class Demo_01 {public static void main(String[] args) {try {String str = readFile("C:\\ a.txt");} catch (FileCannotReadException e) {//打印異常信息System.out.println(e.getMessage());//打印棧軌跡e.printStackTrace();//查看異常: 1. 查看異常名字 2. 查看異常信息 3. 從棧軌跡尾端開始排查(控制臺中從上致下)//如果異常最終拋給了JVM,JVM默認打印這個異常的棧軌跡}}private static String readFile(String string) throws FileCannotReadException {//如果是是以C開頭,則認為這個文件不可被讀取if(string == null){//運行時異常,可以處理,也可以不處理throw new NullPointerException("路徑不能為空");}elseif(string.startsWith("C")){//編譯時異常一定要處理throw new FileCannotReadException("文件不能被讀取");}return null;}
}
//當一個類繼承Exception時,默認是編譯時異常//如果一個類繼承的時RuntimeException,才會稱為一個運行時異常//一個類繼承編譯時異常,則這個類時編譯時異常。反之為運行時異常。
class FileCannotReadException extends Exception{public FileCannotReadException() {}public FileCannotReadException(String msg){super(msg);}
}
七、異常方法的重寫和重載
異常不會影響方法的重載。當一個類中方法名一致,但參數列表不一致時發生方法的重載,方法的重載和修飾符、返回值類型、異常都沒有關系。在重寫父類的異常方法時,子類重寫的方法拋出的異常不能超出 父類異常方法拋出異常的范圍(編譯時異常的要求)。方法重寫時必須遵循兩小兩大一小原則。(參考:http://blog.csdn.net/chou_out_man/article/details/77976679)子類不能拋出范圍比父類 更大的異常 --- 針對的是編譯時異常 , 但對運行時異常 。?class A {public void m() throws IOException {}public void m(int i) throws SQLException {}}class B extends A {// 子類不能拋出比父類更多的異常。// 在方法重寫的時候,子類中重寫的方法拋出的異常不能超過父類。---要求的是編譯時異常public void m() throws EOFException, FileNotFoundException, NullPointerException {}}
八、finally關鍵字的運用
無論如何都會執行一次。往往用于一些資源需要回收等一系列 善后處理。public static void main(String[] args) {try {Scanner s = new Scanner(System.in);System.out.println(s.nextInt() / s.nextInt());s.close();} catch (Exception e) {e.printStackTrace();} finally {// 無論代碼中出現異常與否,都會執行一次。System.out.println("執行完畢");}}
無論try的代碼中是否有異常,finally中的代碼都會執行一次。finally執行在try中return和異常發生之前。補充案例:public static void main(String[] args) {System.out.println(m());}@SuppressWarnings("finally")private static int m() {try {return 1;} catch (Exception e) {return 2;} finally {try {return 4;} finally {return 5;}}} // 結果是5
public static void main(String[] args) {System.out.println(m());}private static int m() {int i = 5;// 對于程序而言,是從上到下從左到右依次編譯運行的。try {// return 5;-> i->6return i++;} finally {// i = 6; -> 7i++;System.out.println("Finally:" + i);}}public static void main(String[] args) {System.out.println(m());}public static Person m() {Person p = new Person();try {p.setName("翠花");p.setAge(16);// return p; -> 實際上返回的是p的地址return p;} finally {p = new Person();p.setName("如花");p.setAge(18);}}
總結
以上是生活随笔為你收集整理的Java中异常机制的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。