前 30 名異常處理面試問題和答案 [針對應屆生和有經驗者]
已發表: 2020-09-29異常處理是在算法中實現的一個概念,用於處理可能的運行時錯誤,這可能會破壞程序的正常流程。 可以使用此概念處理的一些錯誤是:
- ClassNotFoundException
- IO異常
- SQL異常
- 遠程異常
- 運行時異常:
- 算術異常
- 空指針異常
- NumberFormatException
- IndexOutOfBoundsException
- ArrayIndexOutOfBoundsException
- StringIndexOutOfBoundsException
這種實現的優點是,如果在執行程序時出現異常,可以防止程序崩潰。 如果沒有異常處理,程序遇到異常就會拋出錯誤,程序的其餘部分不會被執行。 但是,實現此概念將提供一種解決方法,其中如果程序的其餘部分獨立於發生的異常,則它們將被執行。 要了解更多信息,請查看我們的數據科學課程。
閱讀:必讀 30 個 Selenium 面試問答:終極指南
異常處理面試問答
1. 例外是什麼意思?
這是執行程序時有時會遇到的異常情況。 它破壞了程序的正常流程。 有必要處理這個異常; 否則,可能會導致程序突然終止。
2. 解釋如何在 Java 中處理異常。 流程背後的異常處理機制是什麼?

異常處理機制分為三個部分。 這些被稱為:
- 嘗試塊:首先嘗試執行並監視可能發生的任何異常的代碼部分。
- Catch 塊:如果 'try' 塊拋出任何異常,它會被此代碼段捕獲。
- finally 塊:無論在“try”塊中捕獲的異常(如果有),都始終執行此部分下的代碼。 即使沒有異常,該塊下的代碼也會被執行。
3. 是否可以在“try”、“catch”和“finally”塊之間保留其他語句?
不建議在各部分之間包含任何語句 “try”、“catch”和“finally”塊,因為它們構成了異常處理機制的一個完整單元。
嘗試
{
//監控異常的代碼。
}
//這裡不能保留語句
捕捉(異常前)
{
//捕獲try塊拋出的異常,如果有的話。
}
//這裡不能保留語句
最後
{
//不管有什麼異常,這個塊總是被執行。
}
4. 是否可以只包含一個 'try' 塊而沒有 'catch' 和 'finally' 塊?
這會產生編譯錯誤。 'try' 塊後面必須跟一個 'catch' 塊或一個 'finally' 塊,如果不是兩者都有的話。 需要 'catch' 或 'finally' 塊之一,以便異常處理流程不會中斷。
5. 如果控件從 finally 塊本身返回,是否可以保留“finally”塊之後的語句?
這將導致無法訪問的 catch 塊錯誤。 這是因為控件將從“finally”塊本身返回。 在出現異常的行之後,編譯器將無法執行代碼。 這就是為什麼執行會顯示無法訪問的代碼錯誤。
夢想出國留學? 這是適合您的程序6. 解釋一個無法到達的 catch 塊錯誤。
在多個catch塊的情況下,catch塊的放置順序是從最具體到最一般的。 也就是說,應該先出現異常的子類,然後才是超類。 如果先保留超類,後保留子類,編譯器將顯示無法訪問的 catch 塊錯誤。
公共類異常處理
{
公共靜態無效主要(字符串 [] 參數)
{
嘗試
{
int i = Integer.parseInt(“測試”);
//此語句將拋出 NumberFormatException //因為給定的輸入是字符串,而 //指定的格式是整數。
}
捕捉(異常前)
{
System.out.println(“這個塊處理所有異常類型”);
//各種異常都可以在這個 //block 中處理,因為它是異常的超類。
}
捕獲(NumberFormatException 前)
{
//這將給出編譯時錯誤
//這個塊將變得不可訪問,因為
//異常已經被上面的 //catch 塊捕獲
}
}
}
7. 考慮“try”塊中的三個語句:statement1、statement2 和 statement3。 後面是一個“catch”塊,用於捕獲在“try”塊執行期間發生的異常。 假設在 statement2 處拋出異常。 你認為statement3會被執行嗎?
Statement3 將不會被執行。 如果'try'塊在任何時候拋出異常,異常之後的剩餘代碼將不會被執行。 相反,流控制將直接進入“catch”塊。
8.區分Java中的錯誤和異常。
錯誤和異常之間的主要區別在於,雖然錯誤是由 JVM(Java 虛擬機)運行的環境引起的,但異常是由程序本身引起的。 例如,OutOfMemory 是 JVM 耗盡其內存時發生的錯誤。
但是,NullPointerException 是程序嘗試訪問空對象時遇到的異常。 無法從錯誤中恢復。 因此,錯誤的唯一解決方案是終止執行。 但是,可以使用 try 和 catch 塊或通過將異常拋出回調用者函數來解決異常。
必讀: Java 面試問答
9. 異常有哪些類型? 解釋他們。
有兩種類型的異常:
檢查異常
編譯器已知和識別的異常類型。 這些異常只能在編譯時檢查。 因此,它們也被稱為編譯時異常。 這些可以通過使用 try 和 catch 塊或使用 throw 子句來處理。 如果這些異常處理不當,就會產生編譯時錯誤。 示例包括 java.lang.Exception 的子類,但 RunTimeException 除外。
未經檢查的異常
編譯器無法識別的異常類型。 它們僅在運行時發生。 因此,它們也被稱為運行時異常。 在編譯時不會檢查它們。 因此,即使在成功編譯之後,如果處理不當,它們也會導致程序過早終止。 示例包括 java.lang.RunTimeException 和 java.lang.Error 的子類。
10. Java中異常的層次結構是什麼?
java.lang.Throwable 是 Java 中所有錯誤和異常的超類。 該類擴展了 java.lang.Object 類。 catch 塊的參數只能是它的類型或它的子類類型。 Throwable 類包括兩個子類:
- java.lang.Error :這是 Java 中所有錯誤類型的超類。 其中包括的常見錯誤是 -
- java.lang.VirtualMachineError:在此之下 –
- 堆棧溢出錯誤
- 內存不足錯誤
- java.lang.AssertionError
- java.lang.LinkageError:在這個下——
- NoClassDefFoundError
- 不兼容的ClassChangeError
- java.lang.VirtualMachineError:在此之下 –
- java.lang.Exception:這是Java中所有異常類型的超類。 常見的例外情況是——
- 運行時異常
- 算術異常
- NumberFormatException
- 空指針異常
- ArrayIndexOutOfBoundsException
- ClassCastException
- java.lang.InterruptedException
- java.lang.IOException
- java.lang.SQLException
- java.lang.ParseException
- 運行時異常
11. Java 中的運行時異常是什麼? 舉幾個例子。
在運行時發生的異常稱為運行時異常。 編譯器無法識別這些異常,例如未經檢查的異常。 它包括 java.lang.RunTimeException 和 java.lang.Error 的所有子類。 示例包括 NumberFormatException、NullPointerException、ClassCastException、ArrayIndexOutOfBoundException、StackOverflowError 等。
12. 在 Java 中定義 OutOfMemoryError。
它是 JVM 內存不足時遇到的 java.lang.Error 的子類。
13.區分Java中的NoClassDefFoundError和ClassNotFoundException。
NoClassDefFoundError 和 ClassNotFoundException 都在運行時找不到特定類時發生。 但是,它們發生在不同的場景下。 NoClassDefFoundError 是因為在編譯時存在特定類但在運行時丟失而發生錯誤。 當應用程序在運行時嘗試加載未在類路徑中更新的類時遇到異常時,會發生 ClassNotFoundException。
14. 如果'try'或'catch'塊返回控制,'finally'塊是否被執行?
'finally' 塊總是被執行,不管 try 或 catch 塊是否返回控制。
15. 可以手動拋出異常嗎? 如果是,請說明如何。

可以手動拋出異常。 它是使用 'throw' 關鍵字完成的。 手動拋出異常的語法是
拋出 InstanceOfThrowableType;
下面是使用“throw”關鍵字手動拋出異常的示例。
嘗試
{
NumberFormatException ex = new NumberFormatException(); //這裡我們顯式地為NumberFormatException創建一個對象
扔前; //使用 throw 關鍵字顯式拋出 NumberFormatException 對象
}
捕獲(NumberFormatException 前)
{
System.out.println(“在這個塊中,可以捕獲顯式拋出的 NumberFormatException 對象。”);
}
閱讀: 35 大春季面試問答:終極指南
16. 在 Java 中重新拋出異常是什麼意思?
在“try”塊中引發的異常在“catch”塊中處理。 如果“catch”塊無法處理該異常,它可能會使用“throw”關鍵字重新拋出相同的異常。 這種機制稱為重新拋出異常。 實現如下:
嘗試
{
字符串 s = null;
System.out.println(s.length()); //這條語句拋出一個NullPointerException
}
捕捉(NullPointerException 前)
{
System.out.println(“這裡捕獲到 NullPointerException”);
扔前; //重新拋出 NullPointerException
}
17. 為什麼在 Java 中使用 'throws' 關鍵字?
如果一個方法有可能在無法處理的情況下拋出異常,它應該使用'throws'關鍵字指定該異常。 這將有助於該方法的調用函數處理該異常。 使用“throws”關鍵字的語法是,
return_type method_name(parameter_list) throws exception_list
{
//代碼
}
這裡,exception_list 是方法可能拋出的異常列表。 這些異常應該用逗號分隔。 代碼示例:
公共類異常處理
{
公共靜態無效主要(字符串 [] 參數)
{
嘗試
{
方法WithThrows();
}
捕捉(NullPointerException 前)
{
System.out.println("methodWithThrows() 方法拋出的 NullPointerException 將在此處捕獲");
}
}
static void methodWithThrows() 拋出 NullPointerException
{
字符串 s = null;
System.out.println(s.length()); //這條語句拋出NullPointerException
}
}
18. 通常建議在“finally”塊內保持清理操作,例如關閉數據庫資源。 為什麼有必要?
無論是否在“try”塊中引發異常或是否在“catch”塊中捕獲了引發的異常,都始終執行“finally”塊。 將清理操作保留在“finally”塊中可確保這些操作在任何情況下都可以執行,並且不會受到可能會或可能不會上升的異常的影響。
19. 你如何區分 Java 中的 final、finally 和 finalize?
首先,'final' 是一個關鍵字,可用於使變量、方法或類成為不可更改的。 簡單來說,如果一個變量被聲明為final,一旦它被初始化,它的值就不能被改變。 如果一個方法被聲明為 final,它就不能在子類中被覆蓋或修改。 如果一個類被聲明為 final,它就不能被擴展為更多的類。
其次,“finally”是一個與“try”和“catch”塊一起用於異常處理的塊。 無論引發的異常或是否處理了引發的異常,都會始終執行此塊。 通常,此塊用於執行清理操作以關閉數據庫連接、I/O 資源等資源。
第三,finalize() 方法是受保護的方法。 它屬於 java.lang.Object 類。 在 Java 中創建的每個類都繼承此方法。 垃圾收集器線程在從內存中刪除對象之前調用此方法。 在從內存中刪除對象之前,此方法用於執行一些清理操作。
protected void finalize() 拋出 Throwable
{
//清理操作
}
20、什麼是java中的自定義異常?
Java中可以根據程序流程的要求拋出異常類。 這些異常稱為用戶定義的異常。 它們也稱為自定義異常。 這些異常必須擴展異常層次結構中的任何一個類。
21. 你會如何解釋 Java 中的 ClassCastException?
當 JVM 無法將一種類型的對象轉換為另一種類型時,會引發此異常。 這是一個 RunTimeException。
22. 區分 Java 中的 throw、throws 和 throwable。
首先,關鍵字“throw”用於在 Java 中手動拋出異常。 使用這個關鍵字,可以從任何方法或塊中拋出異常。 但是,異常必須是 java.lang.Throwable 類的類型,或者它屬於 java.lang.Throwable 類的子類之一。
其次,在 Java 的方法簽名中使用了關鍵字“throws”。 如果該方法能夠拋出異常,則由該方法指示。 提到的異常由它們各自的調用函數處理。 它可以通過使用 try 和 catch 塊或使用 throws 關鍵字來完成。
第三,Java中所有類型錯誤和異常的超類稱為Throwable。 它是 java.lang 包的成員。 JVM 或 throw 語句僅引發此類或其子類的實例。 catch 塊應該只包含一個參數,它應該是這種類型或其子類。 如果創建了自定義異常,它們也應該擴展這個類。
23. 解釋 Java 中的 StackOverflowError。
這是JVM在運行時堆棧溢出時拋出的錯誤。
24. 是否可以用子類中的已檢查異常重寫拋出未檢查異常的超類方法?
這是不可能的,因為如果超類方法拋出未經檢查的異常,它將在子類中被相同的異常或任何其他未經檢查的異常覆蓋。 但是,它不能被檢查異常覆蓋。
25.在Java中定義鍊式異常。
在程序中,一個異常可以通過引發多米諾骨牌效應引發許多異常。 這會導致一系列異常。 知道異常的實際原因的位置是有益的。 這可以通過 Java 中的鍊式異常功能實現。 這是自 JDK 1.4 以來引入的。 為了在 Java 中實現鍊式異常,Throwable 類中包含了兩個新的構造函數和兩個新方法。 這些是,
Throwable 類的構造函數:
- Throwable(Throwable Cause):原因是引發當前異常的異常。
- Throwable(String msg, Throwable Cause):msg 字符串是異常消息。 引發當前異常的異常是這裡的原因。
Throwable 類的方法:
- getCause() 方法:此方法返回引發異常的真正原因。
- initCause(Throwable Cause) 方法:調用異常的原因由該方法設置。
26. 哪個類被定義為Java中所有類型錯誤和異常的超類?
所有類型的錯誤和異常的超類是 Java 中的 java.lang.Throwable。
27. 什麼可以歸類為 try、catch 和 finally 塊的正確組合?
try 和 catch 塊的組合。
嘗試
{
//嘗試塊
}
捕捉(異常前)
{
//捕獲塊
}
try 和 finally 塊的組合。
嘗試
{
//嘗試塊
}
最後
{
//最終阻塞
}
三者的組合:try、block、finally 塊。
嘗試
{
//嘗試塊
}
捕捉(異常前)
{
//捕獲塊
}
最後
{
//最終阻塞
}
28. 為什麼要使用 printStackTrace() 方法?
此方法用於打印有關發生的異常的詳細信息。
29. 檢查異常的例子有哪些?
檢查異常的一些示例包括 ClassNotFoundException、SQLException 和 IOException。

30. 有哪些未經檢查的異常的例子?
未經檢查的異常的一些示例包括 NullPointerException、ArrayIndexOutOfBoundsException 和 NumberFormatException。
另請閱讀:必須閱讀 47 OOPS 面試問題和答案,適合應屆生和有經驗的人
包起來
如果您有興趣了解有關大數據的更多信息,請查看 upGrad 和 IIIT-B 的全棧軟件開發 PG 文憑,該文憑專為在職專業人士設計,提供 500 多個小時的嚴格培訓、9 個以上的項目和作業,IIIT -B 校友身份、實用的實踐頂點項目和頂級公司的工作協助。
如果您有興趣學習數據科學並選擇該領域的職業,請查看 IIIT-B 和 upGrad 的數據科學執行 PG 計劃,該計劃專為在職專業人士創建,提供 10 多個案例研究和項目、實用的實踐研討會,與行業專家的指導,與行業導師的一對一,與頂級公司的 400 多個小時的學習和工作協助。
