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

開篇介紹

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

說一下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.printStacktrac

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。

throw 和 throws 的區別?

throw:

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

throws:

  • throws 語句是用在方法聲明後面,表示如果拋出異常,由該方法的調用者來進行異常的處理。
  • throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
  • throws 表示出現異常的一種可能性,並不一定會發生這種異常。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章