摘要:阻止當前方法或作用域的,稱為異常。一非檢查異常和,以及她們的子類。強制要求對這類異常做預備處理使用或者。這樣的異常一般是由程序的運行環境導致的。后跟的是異常對象,或者異常對象的引用。
異常 什么是異常
相異與常態,和正常情況下不一致,有錯誤出現。 阻止當前方法或作用域的,稱為異常。
異常分類
Throwable類是Java異常類型的頂層父類,一個對象只有是 Throwable 類的(直接或者間接)實例,他才是一個異常對象,才能被異常處理機制識別。JDK中內建了一些常用的異常類,我們也可以自定義異常
Throwable又派生出Error類和Exception類。
Error
錯誤: Error類以及他的子類的實例,代表了JVM本身的錯誤。錯誤不能被程序員通過代碼處理,Error很少出現。因此,程序員應該關注Exception為父類的分支下的各種異常類。
Exception
Exception以及他的子類,代表程序運行的發生的各種不同不期望的事件,可以被java的異常處理機制所捕獲,是異常處理的核心。
總體上我們根據Javac對異常的處理要求,將異常類分為2類。
一、非檢查異常
Error和RuntimeException,以及她們的子類。javac在比那一的時候,不會提示和發現這樣的異常,不要求用程序去處理這些異常,所以,最好的解決辦法就是,我們應該是修正代碼,而不是捕獲異常處理,這樣的異常多半是代碼寫的有誤。 如除0錯誤ArithmeticException,錯誤的強制類型轉換錯誤ClassCastException,數組索引越界ArrayIndexOutOfBoundsException,使用了空對象NullPointerException等等。
二、檢查異常
除了Error 和 RuntimeException的其它異常。javac強制要求對這類異常做預備處理(使用 try..catch..finally或者throws)。 在方法中要么用try-catch語句捕獲它并處理,要么用throws子句聲明拋出它,否則編譯不會通過。這樣的異常一般是由程序的運行環境導致的。程序員就應該為這樣的異常時刻準備著。異常處理
try-catch
當遇到異常時,就會中斷執行,然后程序的控制權將會移交catch中的異常處理程序
try會拋出很多種類型的異常
針對不同的異常,在不同的catch中處理,但是我們仍然需要注意一下: (先寫子類后寫父類)
try-catch-finally
實例package tryCatchDemo; public class Testdemo { public int test() { int initNum = 10; int result = 100; try { while(initNum > -1) { initNum --; result = result + 100/initNum; } return result; }catch(Exception e) { e.printStackTrace(); // 打印出錯誤 System.out.println("循環異常"); return -1; } } }
package tryCatchDemo; public class test { public static void main(String[] args) { // TODO Auto-generated method stub Testdemo t = new Testdemo(); int result = t.test(); System.out.println("拋出異常了,此時返回值為"+ result); } }
修改一下
public int test1() { int initNum = 10; int result = 100; try { while(initNum > -1) { initNum --; result = result + 100/initNum; } return result; }catch(Exception e) { e.printStackTrace(); // 打印出錯誤 System.out.println("循環異常"); return -1; }finally{ System.out.println("最終執行!!"); return 999; } }
再修改一下
public int test2() { int initNum = 10; int result = 100; try { while(initNum > -1) { initNum --; result = result + 100/initNum; } return result; }catch(Exception e) { e.printStackTrace(); // 打印出錯誤 System.out.println("循環異常"); return result = 1000; }finally{ System.out.println("最終執行!!"); System.out.println("此時result的值為!!"+result); } }異常的拋出
throw 將產生的異常拋出(強調的是動作)
throws 如果一個方法可能會出現異常,但沒有能力處理這種異常,可以在方法聲明處用throws子句來聲明拋出異常。
實例
package throw_demo1; public class newError { // 定義一個方法,拋出 數組越界和算術異常(多個異常 用 "," 隔開) public void Test1(int x) throws ArrayIndexOutOfBoundsException,ArithmeticException{ System.out.println(x); if(x == 0){ System.out.println("沒有異常"); return; } //數據越界異常 else if (x == 1){ int[] a = new int[3]; a[3] = 5; } //算術異常 else if (x == 2){ int i = 0; int j = 5/0; } } }
package throw_demo1; public class test { public static void main(String[] args) { // TODO Auto-generated method stub //創建對象 newError object = new newError(); // 調用會拋出異常的方法,用try-catch塊 try{ object.Test1(0); }catch(Exception e){ System.out.println(e); } // 數組越界異常 try{ object.Test1(1); }catch (ArrayIndexOutOfBoundsException e) { System.out.println("數組越界異常:"+e); } // 算術異常 try{ object.Test1(2); }catch(ArithmeticException e){ System.out.println("算術異常:"+e); } //使用 throw 拋出異常(可以拋出異常對象,也可以拋出異常對象的引用) try{ ArrayIndexOutOfBoundsException exception = new ArrayIndexOutOfBoundsException(); // 拋出異常 throw exception;//new ArrayIndexOutOfBoundsException(); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("thorw拋出異常:"+e); } } }
throw與throws的區別
1. throw 在方法體內使用,throws 函數名后或者參數列表后方法體前 2. throw 強調動作,而throws 表示一種傾向、可能但不一定實際發生 3. throws 后面跟的是異常類,可以一個,可以多個,多個用逗號隔開。throw 后跟的是異常對象,或者異常對象的引用。自定義異常
class 自定義異常類 extends 異常類型(Exception){ // 因為父類已經把異常信息的操作都完成了,所在子類只要在構造時,將異常信息傳遞給父類通過super 語句即可。 // 重寫 有參 和 無參 構造方法 }
// 一個DrunkException異常 package throwdemo2; public class DrunkException extends Exception{ public DrunkException() { super(); } public DrunkException(String msg) { super(msg); } }異常鏈
實例
// DrunkException.java package throwdemo2; public class DrunkException extends Exception{ public DrunkException() { super(); } public DrunkException(String msg) { super(msg); } }
//test.java package throwdemo2; public class test { public static void main(String[] args) { // TODO Auto-generated method stub test ct = new test(); try { ct.test2(); }catch(Exception e) { e.printStackTrace(); } } // 拋出一個異常 public void test1() throws DrunkException{ throw new DrunkException("你喝多了"); } public void test2() { try { test1(); }catch(DrunkException e) { // 捕獲到test1的異常后,首先拋出一個運行時異常 RuntimeException newErr = new RuntimeException("喝酒誤事"); // 設置該異常的造成原因為test1拋出的異常 newErr.initCause(e); //=> 這里是異常鏈的關鍵 // 拋出最后異常 throw newErr; /** * 同樣異常鏈還可以是 * RuntimeException newErr = new RuntimeException(e); * throw newErr; */ } } }總結
1. 處理運行時異常時,采用邏輯去合理避免,同時配合try catch處理 2. 在多重catch之后,最好加上catch(Exception e)來處理可能會出現的異常 3. 對于不確定的代碼,也可以加上try catch 4. 盡量去處理異常,切記只是簡單的e.printStackTrace()去打印 5. 盡量添加finally語句去釋放占用的資源
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76745.html
摘要:使用包管理中的類在開發過程中需要提供大量的類,那么這么多類會發生同名的情形呢答案是肯定的。那么如何處理這種重名問題呢管理文件解決同名文件沖突。 使用包(Package)管理Java中的類 在開發過程中需要提供大量的類,那么這么多類會發生同名的情形呢?答案是肯定的。那么如何處理這種重名問題呢? 1、管理Java文件 2、解決同名文件沖突。Java允許在類名前面增加一個前綴來限定這個類,...
摘要:借鑒圖片僅用于學習分享,請尊重原創作者,勿用于商用。這其中最關鍵的一步就是從服務器獲得請求數據。基本步驟創建對象也就是創建一個異步調用對象。創建一個新的請求并指定該請求的方法及驗證信息。設置響應請求狀態變化的函數。使用和實現局部刷新。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解...
摘要:借鑒圖片僅用于學習分享,請尊重原創作者,勿用于商用。這其中最關鍵的一步就是從服務器獲得請求數據。基本步驟創建對象也就是創建一個異步調用對象。創建一個新的請求并指定該請求的方法及驗證信息。設置響應請求狀態變化的函數。使用和實現局部刷新。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解...
閱讀 2050·2023-04-26 02:23
閱讀 1792·2021-09-03 10:30
閱讀 1355·2019-08-30 15:43
閱讀 1195·2019-08-29 16:29
閱讀 539·2019-08-29 12:28
閱讀 2338·2019-08-26 12:13
閱讀 2189·2019-08-26 12:01
閱讀 2404·2019-08-26 11:56