1.throw
操作員
當一個異常被一個catch
塊捕獲時,直到它被拋給 Java 機器,它只是一個繼承Exception
(或者更確切地說,Throwable
)的對象。異常對象本身沒有任何神奇的屬性。
異常如何工作的所有邏輯只是 Java 機器在拋出異常時的一種特殊行為方式。
您始終可以將捕獲的異常重新拋出給 Java 機器。為此,您需要使用throw
運算符:
throw exception;
例子:
代碼 | 控制台輸出 |
---|---|
|
|
在這段代碼中,我們捕獲了一個異常,在屏幕上顯示了一條關於它的消息,然後重新拋出它。
catch
重新拋出的異常不能被同一塊中的其他塊捕獲try
。
2. 你的例外
順便說一句,你可以自己創建一個異常對象:它只是一個對象,其類型是Exception
或繼承它的類。並扔掉它。
這比聽起來容易。例子:
代碼 | 控制台輸出 |
---|---|
|
|
在上面的示例中,我們創建了一個新的異常對象,其類型為RuntimeException
並立即使用運算符將其拋出throw
。
它會立即被catch
塊捕獲,因為 RuntimeException 繼承了Exception
. 該catch (Exception except)
代碼捕獲所有繼承該類的類的異常對象Exception
。
3.finally
關鍵詞
另一個重點。有時程序員需要執行一些操作,而不管代碼中是否發生異常。例如,假設我們打開一個文件進行寫入。打開的文件必須通過調用關閉close()
。
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
finally
{
// Code that must executed no matter what happens
}
為了執行這些強制性操作,另一種塊 ( finally
) 被添加到try-catch
構造中,從而創建了try-catch-finally
構造。它看起來像這樣:
例子:
FileInputStream source = null;
try
{
source = new FileInputStream("c:\\note.txt");
source.read();
}
catch(Exception except)
{
System.out.println("Caught the exception");
throw except;
}
finally
{
if (source != null)
source.close();
}
finally
塊中的代碼 將在任何情況下執行,無論是否有異常。即使拋出異常但未被捕獲,該finally
塊仍會執行。
順便說一句,如果您不想捕獲異常,但確實需要一個finally
塊,請使用結構的簡寫符號try-catch-finally
:一個try-finally
塊。它看起來像這樣:
try
{
// Code where an exception might occur
}
finally
{
// Code that must executed no matter what happens
}
GO TO FULL VERSION