Java中的異常處理[附例子]
已發表: 2020-11-12異常是程序中不需要的和意外的事件,程序員從不想要但必須多次處理它。 好的一面是,使用面向對象的語言 Java 可以通過稱為“Java 中的異常處理”的概念來減輕這些不良事件。 它不會修復異常,但提供了另一種處理方法。
發生異常的原因有很多,包括輸入不正確的數據、硬件故障、連接失敗、服務器宕機等。因此,異常處理在學習 Java 的過程中一直很重要,因為它有助於確保正常意外事件發生時的程序流程。 忽略異常可能會導致整個軟件崩潰,並可能導致數據丟失。
現在我們對異常和異常處理有了一個概念,讓我們深入研究它,並了解 Java 如何幫助處理異常。
閱讀:異常處理面試問題
目錄
什麼是異常處理?
開發人員可以預測一段代碼在運行時可能引發的異常。 許多學習者模糊不清的最重要的事情之一是所有異常都發生在運行時而不是編譯時。 Java 只能在運行時處理異常。 Java 程序中使用某些關鍵字來創建異常處理程序塊。
java.lang.Exception是所有異常類的父類。 Exception類是內置Throwable類的子類,後者是Object類的子類。 除了 Exception,Throwable 還有另一個類,即 Error,它是程序執行過程中的異常情況,Java 程序無法處理,這是 Error 和 Exceptions 之間的主要區別。

如上圖所示,Java中的Exceptions主要有兩類。 在下一節中,我們將詳細了解 Java 中的異常類型。
Java 異常
異常的根本原因是程序員或物理資源由於某些原因而失敗的原因。 基於此,Java 中的異常主要有兩類,具體如下:
- 檢查異常
- 未經檢查的異常
1.檢查異常
檢查的異常被稱為“編譯時異常”,因為它們在編譯期間由編譯器檢查以監視異常是否由程序員處理。 然後系統顯示編譯錯誤。
這些異常的一些示例是IOException 、 閱讀:面向初學者的 Java 項目構想
2. 未經檢查的異常
未經檢查的異常被稱為“運行時異常”,因為它們發生在程序運行時。 未經檢查的異常通常在編譯期間被忽略並且不被檢查。
這些異常的示例可能是程序中的錯誤,例如邏輯錯誤,或者使用了不受程序員控制並需要係統管理員糾正的錯誤 API。
已檢查與未檢查的異常
區分點 | 檢查異常未經檢查的異常處理時間 | Checked Exceptions 在編譯時被檢查和處理。 | 未檢查的異常在編譯時不檢查。 |
異常識別 | 如果方法拋出檢查異常,程序會給出編譯錯誤。 | 程序編譯得很好,因為編譯器無法檢查異常。 | |
遺產 | 它們不繼承 RuntimeException 類。 | 它們是 RuntimeException 類的子類。 | |
開發者的角色 | 可由開發人員處理。 | 開發人員無法處理。 |
了解異常是處理它們之前的主要步驟。
Java 如何幫助處理異常?
現在我們知道 Java 中有兩種類型的異常,即已檢查和未檢查。 如果一個方法拋出一個檢查的異常,它應該用try-catch 塊來處理,或者應該聲明' throws'關鍵字以避免程序中的編譯錯誤。
已檢查異常的示例:
這是一個讀取名為“Java”的文件的程序。 有三個地方會拋出已檢查的異常:
- FileInputStream:用於指定文件路徑和名稱 throw FileNotFoundException 。
- read() 方法:讀取文件內容拋出IOException ;
iii. close() 方法:關閉文件輸入流會拋出IOException 。
導入java.io.*;
類示例{
公共靜態無效主要(字符串參數[])
{
FileInputStream fis = null ;
/*構造函數FileInputStream(文件文件名)
* 拋出一個檢查異常 FileNotFoundException */
fis = new FileInputStream ( “B:/java.txt” );
詮釋k;
/* FileInputStream 類的方法 read() throws
* 已檢查異常:IOException
*/
而(( k = fis.read() ) != – 1 )
{
系統。 出來。 打印((字符)k);
}
/*close()方法關閉文件輸入流
* 拋出 IOException*/
fis.close();
}
}
上述程序的輸出:
在線程“main” java.lang中發現異常。 錯誤:未解決的編譯問題:
發現未處理的異常FileNotFoundException
發現未處理的異常IOException
發現未處理的異常IOException
此編譯錯誤的原因:未聲明或處理異常。
必讀: Java GitHub 項目
異常處理方法
有兩種方法可以處理異常,如下所述:
方法 1:聲明 'throws' 異常關鍵字
在上面的程序中,所有三個檢查異常都在 main() 方法中。 因此,避免編譯錯誤的一種方法是使用“throws”關鍵字在方法中聲明異常。 由於 IOException 是 FileNotFoundException 的父類,它也將涵蓋這一點。
使用 throws 關鍵字更新程序:
導入java.io.*;
類示例{
公共靜態void main( String args[])拋出IOException
{
FileInputStream fis = null ;
fis = new FileInputStream ( “B:/java.txt” );
詮釋k;
而(( k = fis.read() ) != – 1 )
{
系統。 出來。 打印((字符)k);
}
fis.close();
}
}
輸出:
在屏幕上顯示文件的內容。
方法 2:使用 try-catch 塊處理異常。
這是對上述一種更高級的方法,也是最佳異常處理實踐之一。 包含 try-catch 塊的修改後的程序代碼如下:

導入java.io.*;
類示例{
公共靜態無效主要(字符串參數[])
{
FileInputStream fis = null ;
試試{
fis = new FileInputStream ( “B:/java.txt” );
}捕捉( FileNotFoundException fnfe){
系統。 out .println( "文件不是" +
“出現在指定的路徑” );
}
詮釋k;
試試{
而(( k = fis.read() ) != – 1 )
{
系統。 出來。 打印((字符)k);
}
fis.close();
}捕捉( IOException ioe){
系統。 out .println( “I/O錯誤” +ioe);
}
}
}
輸出:
此代碼最終將顯示文件內容。
未經檢查的異常示例
Unchecked 異常在編譯時不會被檢查。 如果沒有聲明或處理程序,程序不會給出編譯錯誤,並且可以正常運行。 開發人員的工作是提前預測可能導致此類異常的情況並進行處理。 所有未經檢查的異常都是RuntimeException類的子類。
類示例{
公共靜態無效主要(字符串參數[])
{
整數1= 10 ;
整數2 = 0 ;
/*將任意數除以0
* 將拋出算術異常
*/
int res=num1/num2;
系統。 輸出.println(res);
}
}
該代碼將使用此代碼成功編譯,但在運行時,它會拋出ArithmeticException ,因為在編譯時未檢查未檢查的異常。 讓我們看另一個例子。
類示例{
公共靜態無效主要(字符串參數[])
{
int arr[] ={ 1 , 2 , 3 , 4 , 5 };
/* 數組有 5 個元素,但我們想要
* 顯示第 8 個元素值。 它會拋出
* ArrayIndexOutOfBoundsException
*/
系統。 輸出.println(arr[ 7 ]);
}
}
此代碼也將成功編譯,因為ArrayIndexOutOfBoundsException是未經檢查的異常。
在這裡,為了處理未經檢查的異常,應該向用戶顯示他想要顯示的異常消息,但它不存在於數組中。
使用 try-catch 塊處理上述代碼異常
類示例{
公共靜態無效主要(字符串參數[]){
試試{
int arr[] ={ 1 , 2 , 3 , 4 , 5 };
系統。 輸出.println(arr[ 7 ]);
}
捕捉( ArrayIndexOutOfBoundsException e){
系統。 out .println( "指定的索引不存在" +
“在陣列中。” );
}
}
}
輸出:
指定的索引在數組中不存在。
注意:一個 try 塊內可以有多個 catch 塊來處理不同的異常。
方法3 :使用'finally'關鍵字
有時即使發生異常,也需要執行代碼。 這是使用final關鍵字的地方。 這是帶有“finally”關鍵字的典型代碼。
公共 int getPlayerScore(字符串播放器文件)
拋出 FileNotFoundException {
掃描儀內容 = null;
嘗試 {
內容=新掃描儀(新文件(playerFile));
return Integer.parseInt(contents.nextLine());
}最後{
如果(內容!= null ){
內容.close();
}
}
}
在這裡,最後一個塊表示我們希望 Java 在嘗試讀取文件時運行的代碼。
即使拋出FileNotFoundException ,Java 也會調用finally的內容。
我們可以通過修改以下代碼來處理異常:
公共 int PlayerScore(字符串 playerRuns){
掃描儀內容;
嘗試 {
內容=新掃描儀(新文件(playerRuns));
return Integer.parseInt(contents.nextLine());
} 捕捉(FileNotFoundException noFile){
logger.warn(“找不到文件。”);
返回0;
} 最後 {
嘗試 {
如果(內容!= null){
內容.close();
}
} 捕捉(IOException ioexc){
logger.error(“無法關閉閱讀器。”, ioexc);
}
}

}
結論
通過本文,我們嘗試了解Java 中錯誤和異常以及異常處理的基礎知識。 我們希望本指南能讓您更好地了解 Java 提供的這一獨特功能,並且您現在可以更好地處理異常並從中恢復。 結論
Java 提供了處理從特定異常到通用異常的方法。 事先無法輕易預測的異常稱為未處理異常。 捕獲所有異常可以讓開發團隊了解代碼的質量以及可以快速修復的錯誤的根本原因。
如果您有興趣了解有關 Java、全棧開發的更多信息,請查看 upGrad 和 IIIT-B 的全棧軟件開發 PG 文憑。 它是為專業人士精心策劃的,並確保 360 度的職業支持,並包括要開展的現場項目。 在課程結束時,您將能夠設計和構建 Swiggy、IMDB 等應用程序。
這聽起來是不是很令人興奮!-