【007期】JavaSE面試題(七):異常

開篇介紹

你們好,我是Java最全面試題庫的提褲姐,今天這篇是面試系列的第七篇,主要總結了JavaSE中異常類相關面試題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

說一下Java中的異常體系?

Java的異常體系

Error和Exception的區別?

Error(錯誤): 系統中的錯誤,是在程序編譯時出現的錯誤,只能經過修改程序才能修正。通常是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。面試

Exception(異常): 表示程序能夠處理的異常,能夠捕獲且可能恢復。遇到這類異常,應該儘量處理異常,使程序恢復運行,而不該該隨意終止異常。數組

寫出你最多見的 5 個 RuntimeException?

  • java.lang.NullPointerException 空指針異常;出現緣由:調用了未經初始化的對象或者是不存在的對象。
  • java.lang.ClassNotFoundException 指定的類找不到;出現緣由:類的名稱和路徑加載錯誤;一般都是程序 試圖經過字符串來加載某個類時可能引起異常。
  • java.lang.NumberFormatException 字符串轉換爲數字異常;出現緣由:字符型數據中包含非數字型字符。
  • java.lang.IndexOutOfBoundsException 數組角標越界異常,常見於操做數組對象時發生。
  • java.lang.IllegalArgumentException 方法傳遞參數錯誤。
  • java.lang.ClassCastException 數據類型轉換異常。

如何處理異常?

異常的處理方式有兩種:函數

  • ⾃⼰處理。
  • 向上拋, 交給調⽤者處理。

具體的處理方式的選擇原則:測試

  • 本身明確的知道如何處理的, 就要處理掉。
  • 不知道如何處理的, 就交給調⽤者處理。

注:異常, 不能捕獲了以後什麼也不作。或者只是使⽤e.printStacktracspa

try()裏面有⼀個return語句, 那麼後面的finally{}裏面的代碼會不會被執行?何時執行,return前仍是return後?

若是try中有return語句, 那麼finally中的代碼仍是會執⾏。 由於return表示的是要整個方法體返回, 因此,finally中的語句會在return以前執⾏。 可是return前執行的finally塊內,對數據的修改效果對於引用類型和值類型會所不一樣:指針

// 測試 修改值類型

static int f() {

    int ret = 0;

    try {

        return ret;  // 返回 0,finally內的修改效果不起做用

    } finally {

        ret++;

        System.out.println("finally執行");

    }

}



// 測試 修改引用類型

static int[] f2(){

    int[] ret = new int[]{0};

    try {

        return ret;  // 返回 [1],finally內的修改效果起了做用

    } finally {

        ret[0]++;

        System.out.println("finally執行");

    }
複製代碼

調用下面的方法,獲得的返回值是什麼?

public int getNum() {

        try {

            int a = 1 / 0;

            return 1;

        } catch (Exception e) {

            return 2;

        } finally {

            return 3;

        }

    }
複製代碼

返回值爲3。 代碼在走到第 3 行的時候遇到了一個 MathException,這時第四行的代碼就不會執行了,代碼直接跳轉到 catch語句中,走到第 6 行的時候,異常機制有這麼一個原則若是在 catch 中遇到了 return 或者異常等能使該函數終止的話那麼有 finally 就必須先執行完 finally 代碼塊裏面的代碼而後再返回值。所以代碼又跳到第 8 行,惋惜第 8 行是一個return 語句,那麼這個時候方法就結束了,所以第 6 行的返回結果就沒法被真正返回。若是 finally 僅僅是處理了一個釋放資源的操做,那麼該道題最終返回的結果就是 2。所以上面返回值是 3。code

throw 和 throws 的區別?

throw:orm

  • throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。
  • throw 是具體向外拋出異常的動做,因此它拋出的是一個異常實例,執行 throw 必定是拋出了某種異常。

throws:cdn

  • throws 語句是用在方法聲明後面,表示若是拋出異常,由該方法的調用者來進行異常的處理。
  • throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道須要捕獲的異常的類型。
  • throws 表示出現異常的一種可能性,並不必定會發生這種異常。
相關文章
相關標籤/搜索