java通过异常处理错误,java基础之通过错误处理异常
我們在編程過程中,通常需要時刻關注可能遇到的問題,此時可以把問題分為兩類:普通問題與異常問題。普通問題:我們可以通過從當前環境中獲取到的信息來解決這個問題;而異常問題:在當前環境中獲取到的信息并不能解決這個問題,所以我們阻止了程序的執行,跳出當前的環境,將這個異常問題,拋到上一級的環境中去解決。可以看出異常機制存在兩種基本模型:終止模型(假設異常非常的關鍵,程序無法自我修復)和恢復模型(可以通過異常處理程序,調用相應的方法來修復出現的錯誤),然而我們現在所見到的基本為終止模型。
如果方法內部出現了異常,方法將在拋出異常的過程中終止。我們可以通過try建立監控區,在出現異常時跳轉到catch區讓方法繼續執行。我們在編程過程中,關注的重點常在于異常的名字,所以我們可以定義自己需要的異常,此時只需要繼承Exception類即可,例如:
public class LogingException extends Exception{
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger("LoggingException");
public LogingException(){
StringWriter trace = new StringWriter();
printStackTrace(new PrintWriter(trace));
logger.severe(trace.toString());
}
}
我們實現在一個異常,同時重載了printStackTrace()方法,增加了一個新的功能,在拋出異常時可以自動記錄日志。printStackTrace()方法會打印Throwable和Throwable的調用棧軌跡,我們可以通過getStackTrace()獲取printStackTrace()所提供的信息,會返回一個由棧軌跡中的元素所構成的數組,元素0為棧頂元素,為調用序列中的最后一個方法的調用;最后一個元素為棧底元素,為調用序列中的第一個方法的調用。我們也可以在catch中將異常重新拋出,此時printStackTrace()顯示的為原來的異常拋出點的調用棧信息,如果想顯示重新拋出點的信息,可以先調用fillInStackTrace()方法,但此時原來異常拋出點的調用棧信息會丟失。
如果我們也需要顯示原始異常的信息該怎么做呢?Throwable的構造方法中其中一個就是介紹cause對象作為參數,cause表示原始異常,可以將原始異常傳遞給新的異常。在出現異常時,可以通過這樣的異常鏈追蹤到異常的最初位置,這也是為什么我們調試異常時先從最下面開始看起。
如果我們在方法中拋出異常時,Java強制我們禮貌的告訴別人某個方法可能會拋出的異常類型,這樣別人在調用這個方法時就可以作相應的處理,這就是異常說明,通過關鍵字throws來實現,它屬于方法聲明的一部分。在Java的繼承關系中關于異常由以下幾個需要注意的點:
①如果父類某個非構造方法拋出了異常,那么子類相應的方法只能拋出基類方法中列出的那些異常或異常派生出的異常。
②對于構造方法則恰恰相反,子類構造方法必須拋出包含父類構造方法所拋出的異常,這是由于子類通常需要調用父類的構造方法進行初始化。
③雖然編譯器對異常說明做了強制要求,但是異常說明并不屬于方法類型一部分,所以就不要想著能通過拋出不同的異常來重載方法了。
④在catch方法對異常類型進行匹配時,catch中的參數exception會匹配該異常類及其子類,匹配成功后,java會認為異常得到了處理,就不在繼續向下查找了,這點和以前所學的switch不同,沒有break之類的。這點非常重要,如果你修改程序方法,拋出了跟具體派生異常,別人并不需修改代碼也可以捕獲該異常。例如:
class Annoyance extends Exception{};
class Sneeze extends Annoyance{};
public class Human {
public static void main(String[] args) {
try{
throw new Annoyance();
}catch(Sneeze s){
System.out.println("Caught Sneeze");
}catch(Annoyance a){
System.out.println("Caught Annoyance");
}
try{
throw new Sneeze();
}catch(Annoyance a){
System.out.println("Caught Annoyance");
}
//catch(Sneeze s){
//System.out.println("Caught Sneeze");
//}
}
}
java中還存在一類比較特殊的異常RuntimeException(常見到的NullPointerException就屬于它),這屬于運行時異常,編譯器不對異常聲明進行強制檢查。這也能給我帶來很多的便利,我們可以不用寫try/catch或異常聲明,如果出現異常,會自動沿著調用棧向上冒泡。也可以通過前面提到的異常鏈,使用RuntimeException包裝強制檢查的異常,然后通過getCause()捕獲特定的異常。
總結
以上是生活随笔為你收集整理的java通过异常处理错误,java基础之通过错误处理异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 备份
- 下一篇: 遮罩,在指定元素上进行遮罩