天天看點

異常01:Error和Exception

作者:崔九八

什麼是異常

實際工作中,遇到的情況不可能是非常完美的。比如:你寫的某個子產品,使用者輸入不一定符合你的要求、你的程式要打開某個檔案,這個檔案可能不存在或者檔案格式不對,你要讀取資料庫的資料,資料可能是空的等。我們的程式再跑着,記憶體或硬碟可能滿了。等等。

軟體程式在運作過程中,非常可能遇到剛剛提到的這些異常問題,我們叫異常,英文是: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。

異常01: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(垃圾回收器)

繼續閱讀