日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

04 - JavaSE之异常处理

發布時間:2025/7/14 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 04 - JavaSE之异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

異常的概念(運行期出現的錯誤)

  • java 異常是 java 提供的用于處理程序中錯誤的一種機制。

  • 所謂的錯誤是指在程序運行的過程中發生的一些異常事件。(如:除0溢出,數組下標越界,所要讀取的文件不存在)

  • 設計良好的程序應該在異常發生時提供處理這些錯誤的方法,使得程序不會因為異常的發生而阻斷或產生不可預見的結果。

  • java 程序的執行過程中如果出現異常事件,可以生成一個異常類對象,該異常對象封裝了異常事件的信息并將被提交給java運行時系統,這個過程被稱為拋出(throw)異常。

  • 當 java 運行時系統接收到異常對象時,會尋找能處理這一異常的代碼并把當前異常對象叫給其處理,這一過程稱為捕獲(catch)異常。

  • try里面編寫可能拋出異常的代碼,catch編寫捕獲異常后處理的代碼。

  • 把發生異常的堆棧打印出來:e.printStackTrace();

異常的分類

  • 異常根類 Throwable 分子類 Error + Exception

  • Error 是系統內部錯誤(虛擬機生成并拋出,包括動態鏈接失敗,虛擬機錯誤等,程序不對其做處理)。

  • Exception是我們可以處理的所有異常類的父類,其子類對應了各種各樣可能出現的異常事件,一般需要用戶顯式的聲明或捕獲。

  • Exception 分 RuntimeException(運行期異常)+ 其他。

  • RuntimeException:一類特殊的異常,如除0異常,數組下標越界等,其產生的比較頻繁,處理麻煩,如果顯式的聲明或者捕獲將會對程序的可讀性和運行效率影響很大。因此由系統自動檢測并將它們交給缺省的異常處理程序,用戶可以catch,也可以不catch。

void m(int i) throws ArithmeticException {if(0==i) {throw new ArithmeticException("除0異常 1th");} }public class Test {public static void main(String[] args) {try {Test t = new Test();t.m(0);} catch (Exception e) {System.out.println("除0異常 2th");}} }
  • 常見異常類型舉例:
  • ArithmeticException
  • int i = 1; int k = 0; int m = i/k;
  • NullPointerException
  • String s = null; int l = s.length();
  • ClassCastException
  • Object o = new Object(); String s = (String)o; int l = s.length();
  • NegativeArraySizeException
  • int len = -1; int[] a = new int[len]; a[0] = 0;
  • ArrayIndexOutOfBoundsException
  • int len = 10; int[] a = new int[len]; a[10] = 10;

    異常的捕獲和處理

    • try語句:
  • try語句制定了一段代碼,該段代碼就是一次捕獲并處理的例外的情況。
  • 在執行的過程中,該段代碼可能會產生并拋出一種或幾種類型的異常對象,它后面的catch語句要分別對這些異常做相應的處理。
  • 如果沒有例外產生,所有的catch代碼段都被忽略不執行。
    • catch語句:
  • 在catch語句塊中是對異常進行處理的代碼,每個try語句塊可以伴隨一個或多個catch語句,用于處理可能產生的不同類型的異常對象。
  • 在catch中聲明的異常對象(catch (someExpresion e))封裝了異常事件發生的信息,在catch語句塊中可以使用這個對象的一些方法獲取這個信息:例如:getMessage(); 用來得到有關異常事件的信息;printStackTrace();用來跟蹤異常事件發生時執行堆棧的內容。
    • finally語句:
  • catch語句塊后面可以跟上一個finally語句塊。
  • finally語句為異常處理提供一個統一的出口,使得在控制流程轉到程序的其他部分以前,能對程序的狀態作統一的管理。
  • 無論try所指向的程序是否拋出異常,finally所指定的代碼都要被執行。
  • 通常在finally語句中可以進行資源的清理工作。如:關閉打開的文件;刪除臨時文件等。
  • FileInputStream in = null;try {in = new FileInputStream("myfile.txt");int b = 0;b = in.read();while(-1 != b) {System.out.print((char)b);b = in.rasd();} } catch (FileNotFoundException e) {e.printStackTrace(); } catch (IOException e) {System.out.println(e.getMessage()); } finally {try {in.clsoe();}catch (IOException e) {e.printStackTrace();} }

    異常的拋出

    public void someMethod() throws someExpresion { if(someCondition()) {throw new someExpresion("錯誤原因"); // 然后在某種情況下拋出這種異常} }try {someMethod(); // 調用該方法時試圖捕獲異常 } catch(someExpresion e) {// 異常處理代碼 }

    **
    Tips:

  • public void someMethod() throws someExpresion:
    throws寫在后面聲明該方法可能拋出異常(由系統自動拋出異常),如果寫了這句話,對于RuntimeException 則可以不catch,其他的異常則需要寫try catch,如果你不想寫try catch,則你可以再繼續往外拋(在方法后面寫throws)。
  • 2.throw new someExpresion("錯誤原因");
    表示的是手動拋出異常。
    **

    public class Test {public static void main(String[] args) {Test t = new Test();try {t.method1();} catch (someException e) {e.printStackTrace();}}public void method1() throws someException {method2();}public void method2() throws someException {method3();}public void method3() throws someException {throw new someException("someException occur in method3.");} }

    注意

  • 執行throw語句之后,運行流程立即停止(如上第一份代碼第二個End未打印)。然后系統立即檢查是否有能夠匹配的catch語句塊,如果找到則執行對應的catch語句塊,如果找不到則轉向上一層的try語句塊并繼續查找對應的catch語句塊,如果一直找不到對應的catch語句塊,則異常對象被拋到系統異常處理。
  • public class Test {public static void pro(String s) {if(s != null) {System.out.println(s);}else {throw new NullPointerException("Ooops!, s is null.");}System.out.println("End");}public static void main(String[] args) {try {pro("Hello Java");pro(null);}catch (Exception e) {System.out.println(e.getMessage());}} } /* 打印結果: Hello Java End Ooops!, s is null. */
  • catch時注意:應該先捕獲小的,再捕獲大的,否則編譯報錯。
  • catch (NullPointerException e) {System.out.println("NullPointerException"); } catch (Exception e) {System.out.println(e.getMessage()); }

    使用自定義的異常

    使用自定義異常一般有如下步驟:

  • 通過集成 java.lang.Exception 類聲明自己的異常類。

  • 在方法適當的位置生成自定義異常的實例,并用 throw 語句拋出。

  • 在方法的聲明部分用 throws 語句聲明該方法可能拋出的異常。

  • class MyException extends Exception {private int id;public MyException(String message, int id) {super(message);this.id = id;}public int getId() {return id;} }public class Test {public void regist(int num) throws MyException {if(num < 0) {throw new MyException("人數為負。", 3);}System.out.println("登記人數:" + num);}public void manager() {try {regist(100);}catch (MyException e) {System.out.println("登記失敗,出錯類型碼:" + e.getId());e.printStackTrace();}System.out.println("操作結束");}public static void main(String[] args) {Test t = new Test();t.manager();} }

    異常與繼承

    重寫方法需要拋出與原方法所拋出異常類型一致的異常或不拋出異常。

    例如:

    class A {public void method() throws IOException {...} }class B1 extends A {public void method() throws FileNotFoundException {...} // 范圍小了,錯誤 }class B2 extends A {public void method() throws Exception {...} // 范圍大了,錯誤 }class B3 extends A {public void method() {...} // 正確 }class B3 extends A {public void method() throws IOException, MyException{...} // 錯誤 }

    轉載于:https://www.cnblogs.com/lvonve/p/8228409.html

    總結

    以上是生活随笔為你收集整理的04 - JavaSE之异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。