程序員面試大廠經(jīng)常被問到的Java異常機(jī)制問題,你搞懂了嗎?

Java異常機(jī)制(Exception)

簡單分類:

  • 檢查性異常:最具代表檢查性異常是用戶錯(cuò)誤或問題引起的異常,這是程序員無法預(yù)見的。例如打開一個(gè)不存在的文件時(shí),一個(gè)異常就發(fā)生了,這些異常在編譯時(shí)不能簡單地忽略。

  • 運(yùn)行時(shí)異常:運(yùn)行時(shí)異常是可能被程序員避免的異常。與檢查性相反,運(yùn)行時(shí)異常可以在編譯時(shí)被忽略。

  • 錯(cuò)誤(ERROR):錯(cuò)誤不是異常,而是脫離程序員控制的問題。錯(cuò)誤通常在代碼中容易被忽略。例如:當(dāng)棧溢出時(shí),一個(gè)錯(cuò)誤就發(fā)生了,它們在編譯也檢查不到。

異常體結(jié)構(gòu)

image

Error

  • Error類對(duì)象由Java虛擬機(jī)生成并拋出,大多數(shù)錯(cuò)誤與代碼編寫者所執(zhí)行的操作無關(guān)。

  • Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError),當(dāng)JVM不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn)OutOFMemoryError。這下一場發(fā)生時(shí),Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止;

  • 還有發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí),如類定義錯(cuò)誤(NoClassDefFoundError)、連接錯(cuò)誤(LinkageError).這些錯(cuò)誤是不可查的,因?yàn)樗鼈冊趹?yīng)用程序的控制和處理能力之外,而且絕大多數(shù)是程序運(yùn)行時(shí)不允許出現(xiàn)的狀況。

Exception

  • 在Exception分支中有一個(gè)重要的子類RuntimeException(運(yùn)行時(shí)異常)

    • ArraylndexOutOfBoundsException (數(shù)組下標(biāo)越界)

    • NullPointerException (空指針異常)

    • ArithmeticExeception (算術(shù)異常)

    • MissingResourceException (丟失資源)

    • ClassNotFoundException(找不到類)等異常, 這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理

  • 這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生;

  • Error和Exception的區(qū)別:error通常是災(zāi)難性的致命的錯(cuò)誤,是程序無法控制和處理的,當(dāng)出現(xiàn)這些異常時(shí),JVM一般會(huì)選擇終止線程;Exception通常情況下是可以被程序處理的,并且在程序中應(yīng)該金肯的去處理這些異常。

異常處理機(jī)制

  • 處理異常5個(gè)關(guān)鍵字:

try、catch、finally、throw、throws

  • 捕獲異常:
image
image
image
  • 拋出異常:
image

關(guān)于throw和throws區(qū)別:

  • 區(qū)別1:throw跟在方法聲明后,后面跟的是異常類名, 而throws用在方法體內(nèi),后面跟的是異常對(duì)象名。

  • 區(qū)別2:throw只能拋出一個(gè)異常對(duì)象名,而throws可以拋出多個(gè)異常類名,用逗號(hào)隔開。

  • 區(qū)別3:throw表示拋出異常,由該方法體內(nèi)的語句來處理,而throws表示拋出異常,由該方法的調(diào)用者來處理。

  • 區(qū)別4:throw拋出了異常,執(zhí)行throw一定出現(xiàn)某種異常,而throws表示出現(xiàn)異常的可能性,并不一定出現(xiàn)這種異常。

自定義異常

  • 使用Java內(nèi)置的異常類可以描述在編程時(shí)出現(xiàn)的大部分異常情況。除此之外,用戶還可以自定義異常。用戶自定義異常類,只需繼承Exception類即可。

  • 在程序中使用自定義異常類,大體可分為以下幾個(gè)步驟:

1.創(chuàng)建自定義異常類。

2.在方法中通過throw關(guān)鍵字拋出異常對(duì)象。

3.如果在當(dāng)前拋異常的方法中處理異常,可以使用try-catch語句捕獲并處理;否則在方法的聲明處通過throws關(guān)鍵字指明要拋出給方法調(diào)用者的異常,繼續(xù)進(jìn)行下一步操作。

4.再出現(xiàn)異常方法的調(diào)用思考中捕獲并處理異常。

image

實(shí)際應(yīng)用中的經(jīng)驗(yàn)總結(jié)?。?/h2>
  • 處理運(yùn)行時(shí)異常時(shí),采用邏輯去合理規(guī)避同時(shí)輔助 try-catch處理.

  • 在多重catch塊后面,可以加上一個(gè)catch(Exception)來處理可能被遺漏的異常.

  • 對(duì)于不確定的代碼,也可以加上try-catch,處理潛在的異常.

  • 盡量去處理異常,切忌只是簡單地調(diào)用printStackTraca()去打印輸出.

  • 具體如何處理異常,要根據(jù)不同的業(yè)務(wù)需求和異常類型去決定.

  • 盡量添加finally語句塊去釋放占用的資源. IO~ Scanner~

最新2021整理收集的一些高頻面試題(都整理成文檔),有很多干貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細(xì)講解,也有詳細(xì)的學(xué)習(xí)規(guī)劃圖,面試題整理等,需要獲取這些內(nèi)容的朋友請加Q君樣:484138291

在這里插入圖片描述

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容