什麼是異常
實際工作中,遇到的情況不可能是非常完美的。比如:你寫的某個子產品,使用者輸入不一定符合你的要求、你的程式要打開某個檔案,這個檔案可能不存在或者檔案格式不對,你要讀取資料庫的資料,資料可能是空的等。我們的程式再跑着,記憶體或硬碟可能滿了。等等。
軟體程式在運作過程中,非常可能遇到剛剛提到的這些異常問題,我們叫異常,英文是:Exception,意思是例外。這些,例外情況,或者叫異常,怎麼讓我們寫的程式做出合理的處理。而不至于程式崩潰。
常見的異常:
public class Test01 {
public static void main(String[] args) {
new Test01().a();
}
public void a(){
b();
}
public void b(){
a();
}
}
//輸出結果
Exception in thread "main" java.lang.StackOverflowError
at Demo02.Test01.b(Test01.java:19)
at Demo02.Test01.a(Test01.java:16)
at Demo02.Test01.b(Test01.java:19)
at Demo02.Test01.a(Test01.java:16)
at Demo02.Test01.b(Test01.java:19)
at Demo02.Test01.a(Test01.java:16)
public class Test01 {
public static void main(String[] args) {
System.out.println(11/0);
}
}
//輸出結果
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo02.Test01.main(Test01.java:12)
Process finished with exit code 1
public class Test01 {
public static void main(String[] args) {
System.out.println()
}
}
//輸出結果
java: 需要';'
異常指程式運作中出現的不期而至的各種狀況,如:檔案找不到、網絡連接配接失敗、非法參數等。
異常發生在程式運作期間,它影響了正常的程式執行流程。
簡單分類
要了解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:
檢查性異常:最具代表的檢查性異常是使用者錯誤或問題引起的異常,這時程式員無法預見的。例如要打開一個不存在檔案時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
運作時異常:運作時異常是可能被程式員避免的異常。與檢查性異常相反,運作時異常可能在編譯時被忽略。
錯誤:錯誤不是異常,而是脫離程式員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。
異常體系結構
Java把異常當作對象來處理,并定義一個基類java.lang.Throwable作為所有異常的超類。
在Java API中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error和異常Exception。
Error
Error類對象由Java虛拟機生成并抛出,大多數錯誤與代碼編寫者所執行的操作無關。
Java虛拟機運作錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的記憶體資源時,将出現OutOfMemoryError。這些異常發生時,Java虛拟機(JVM)一般會選擇線程終止;
還有發生在虛拟機試圖執行應用時,如類定義錯誤(NoClassDelFoundError)、連結錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應用程式的控制和處理能力之外,而且絕大多數是程式運作時不允許出現的狀況。
Exception
在Exception分支中有一個重要的子類RuntimeException(運作時異常)
- ArrayIndexOutOfBoundException(數組下标越界)
- NullPointerException(空指針異常)
- ArithmeticException(算術異常)
- MissingResourceException(丢失資源)
- ClassNotFoundException(找不到類)等異常,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。
這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度盡可能避免這類異常的發生;
Error和Exception的差別:Error通常是災難性的緻命的錯誤,是程式無法控制和處理的,當出現這些異常時,Java虛拟機(JVM)一般會選擇終止線程;Exception通常情況下是可以被程式處理的,并且在程式中應該盡可能的去處理這些異常。
每日Java面試題
1.線程種類
Java線程有兩種,一種是使用者線程,一種是守護線程。
2.守護線程的特點
守護線程是一個比較特殊的線程,主要被用做程式中背景排程以及支援性工作。當Java虛拟機中不存在非守護線程時,守護線程才會随着JVM一同結束工作。
3.Java中典型的守護線程
GC(垃圾回收器)