java系列筆記---異常,java系列筆記---

來源:互聯網
上載者:User

java系列筆記---異常,java系列筆記---

異常

一.異常與錯誤的區別

     再講異常之前我們就應該要知道異常和錯誤的區別

     Error類和Exception類的父類都是throwable類,他們的區別是:

     Error類一般是指與虛擬機器相關的問題,如系統崩潰,虛擬機器錯誤,記憶體空間不足,方法調用棧溢等。對於這類錯誤的導致的應用程式中斷,

僅靠程式本身無法恢複和和預防,遇到這樣的錯誤,建議讓程式終止。

    Exception類表示程式可以處理的異常,可以捕獲且可能恢複。遇到這類異常,應該儘可能處理異常,使程式恢複運行,而不應該隨意終止異常。

二.異常的體現分類:

   1.checked 異常檢查期異常 java.lang.Excetion 在編譯期需要人工處理否則編譯失敗:Exception的子類除了運行期異常都是檢查期異常

   2.非Checked異常運行時異常 java.lang.RuntimeException 不需要處理的直接能編譯通過:所有的RuntimeException以及其子類都是運行異常

   舉例:運行期異常

    結果:運行期異常,當你敲好代碼時不會報錯,而當你運行時才會報除數不能為0的錯誤

   舉例:檢查期異常:

   結果:檢查期異常,當你編譯的時候就會報錯,一定要拋出異常編譯才能通過

 三.異常的處理機制

      Java語言主要依賴於 try  catch  finally  和throws  throw  五個關鍵字來描述異常

 1) 在發生異常的地方直接處理

    使用try catch finally  直接處理異常

     a)  try-catch-finally結構中try塊是必須有的,catch和finally塊為可選,但兩者至少必須出現其中之一。

     b) catch  可以同時出現多個,但一個異常最多捕獲一個catch,而且catch的順序是從上往下

     c) finally  無論是否捕獲異常都會執行的一行代碼

示範1:try異常

 1 public class TestException { 2         public static void main(String[] args) { 3              int c = 0; 4                 try 5                 { 6                     int a = 3; 7                     int b = 0; 8                     // 這塊代碼出現了異常 9                      c = a / b;10                     // 那麼異常之後的代碼都不會被執行11                     System.out.println("Hello World");12                 }13                 catch (ArithmeticException e)14                 {15                     System.out.println("除數不能為零");16                 }17                 finally18                 {19                     //不管有沒有發生異常,finally語句塊都會被執行20                     System.out.println("Welcome");21                 }22                 System.out.println(c);23                 // 當b為0時,有異常,輸出為c的初始值024         }25     }26    //輸出結果:除數不能為零  Welcome   0
try異常

示範2:帶有return的異常

 1 import java.io.FileInputStream; 2 import java.io.FileNotFoundException; 3  public class DemoException { 4      public static void main(String[] args) { 5             int a=test3(); 6             System.out.println(a);     7   } 8      @SuppressWarnings("finally") 9      public static int  test3(){10              try {11              System.out.println(9 / 0);12              return 1;13              } catch (Exception e) {14                System.out.println("呵呵");15                 return 2;16             }finally{  17              System.out.println("哈哈");18              return 3;19        }20     }21  }22  //輸出結果 "呵呵""哈哈" 3

 

得出結論:作用範圍   return  終止整個方法體,但在finally出現之前  return是老大  finally 作用範圍> return

2)將異常拋給調用者讓調用者處理 

1   //throws在方法體頭部通過聲明  拋出異常...2     public void dealFile() throws FileNotFoundException{3         FileInputStream fis =new FileInputStream("C:/name.txt");4      }5    //那麼那麼上面調用這個方法可以選擇是繼續拋出,還是捕獲異常

案例一:通過throws拋出異常,調用者直接捕獲拋出的異常

 1 public class TestException { 2      public static void main(String[] args) { 3                  try { 4                       Test3();  //這裡選擇直接捕獲異常,而不是在拋出異常 5                  } catch (NumberFormatException e) { 6                      System.err.println("非資料類型不能轉換。"); 7                 } //System.err.println();這種輸出方式可以輸出錯誤的訊息,在控制台呈現紅色。 8            } 9        10             public static void Test3() throws NumberFormatException{  11                  String s = "abc";  12                 System.out.println(Double.parseDouble(s));  13              }  14     }
throws異常

運行結果:

   非資料類型不能轉換。

注意使用Throws是的限制

兩小原則

 使用throws 聲明拋出異常一個限制

 子類繼承父類重寫父類的方法

 子類拋出的異常必須比父類少

 子類拋出的異常必須比父類小

 兩小原則是針對檢查期異常的,運行期異常不遵循這個規則(RuntimeException 以及子類)

案例二:通過throw拋出異常

 1 public class TestException { 2      public static void main(String[] args) { 3          String s = "abc";   4                if(s.equals("abc")) {   5                      throw new NumberFormatException("不能相等"); 6                  } else {   7                      System.out.println(s);   8                 }   9              }  10     }
throw異常

運行結果如下:

面試題:Throw 和Throws有什麼區別?

 Throw語句是用在方法體內表示拋出的異常由方法體內的語句處理

 Throws  語句是在方法聲明之後拋出異常表示在拋出的異常交給調用者處理

 Throws 要麼使用try –catch –finally 處理要麼繼續拋出

 四.自訂異常 

   所謂自訂異常,通常就是定義一個類,去繼承Exception類或者它的子類。因為異常必須直接或者間接地繼承自Exception類。

  通常情況下,會直接繼承自Exception類,一般不會繼承某個運行時的異常類。

  自訂異常可以用於處理使用者登入錯誤,使用者輸入錯誤提示等。

   自訂異常需要遵循以下步驟

 舉例:自訂異常:

public class MyException extends Exception{    public MyException()    {        super();    }        public MyException(String message)    {        super(message);    }}

一種處理異常方式

public class ExceptionTest4{    public void method(String str) throws MyException    {        if(null == str)        {            throw new MyException("傳入的字串參數不能為null!");        }        else        {            System.out.println(str);        }    }    public static void main(String[] args) throws MyException //異常處理方式1,不斷向外拋出    {        ExceptionTest4 test = new ExceptionTest4();        test.method(null);    }}

另一種異常處理方式:

 1 public class ExceptionTest4 2 { 3  4     public void method(String str) throws MyException 5     { 6         if (null == str) 7         { 8             throw new MyException("傳入的字串參數不能為null!"); 9         }10         else11         {12             System.out.println(str);13         }14     }15 16     public static void main(String[] args)17     {18         //異常處理方式2,採用try...catch語句19         try20         {21             ExceptionTest4 test = new ExceptionTest4();22             test.method(null);23 24         }25         catch (MyException e)26         {27             e.printStackTrace();28         }    29         finally30         {31             System.out.println("程式處理完畢");32         }33 34     }35 }

最後說一句,try-catch-finally雖好用,但是如果是濫用,這樣只是會讓程式的可讀性變的很糟糕,當程式報錯,就無法快速準確的定位了。

如果有個別地方寫的不到位或者不夠完善希望大家多多指點,看了有不明白的地方也可以留言,我也會儘快協助解答。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.