1.throw操作員

當一個異常被一個catch塊捕獲時,直到它被拋給 Java 機器,它只是一個繼承Exception(或者更確切地說,Throwable)的對象。異常對象本身沒有任何神奇的屬性。

異常如何工作的所有邏輯只是 Java 機器在拋出異常時的一種特殊行為方式。

您始終可以將捕獲的異常重新拋出給 Java 機器。為此,您需要使用throw運算符:

throw exception;

例子:

代碼 控制台輸出
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

在這段代碼中,我們捕獲了一個異常,在屏幕上顯示了一條關於它的消息,然後重新拋出它。

catch重新拋出的異常不能被同一塊中的其他塊捕獲try


2. 你的例外

順便說一句,你可以自己創建一個異常對象:它只是一個對象,其類型是Exception或繼承它的類。並扔掉它。

這比聽起來容易。例子:

代碼 控制台輸出
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the 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
}