簡體   English   中英

在Java方法中拋出特定異常是否多余?

[英]Is it redundant to throw specific exception in Java's method?

考慮以下代碼片段。

public static void main(String [] args) throws IOException
{
    ....
}

我的假設告訴我:任何異常,無論是arrayOutOfBoundsException還是IOException ,由於沒有捕獲到異常(並且拋出的異常不是一般的),程序將被終止。 但是我確實看到人們在方法簽名上拋出了特定的異常。

我的問題:這樣做是否多余? (因為任何異常都會導致程序終止)

如果不是多余的,人們這樣做的原因是什么?

什么捕獲了main方法拋出的異常?

由於沒有捕捉到異常,程序將被終止

這似乎是這樣,因為main方法是你的程序的開始。 但是實際上,Java虛擬機(JVM)調用了main方法,因此從技術上講,它捕獲並處理了它拋出的任何異常。

JVM所做的處理僅僅是在錯誤流中打印異常的堆棧跟蹤,然后終止程序*。 因此,在程序終止之前,您會在控制台中看到堆棧跟蹤(除非錯誤流已重定向到其他位置,如文件)。

*如果JVM中沒有其他程序(例如實時非守護程序線程)在運行,它將終止。

為什么要聲明它?

但是我確實看到人們在方法簽名上拋出了特定的異常。 這樣做多余嗎? (因為任何異常都會導致程序終止)

首先,我應該澄清,通過編寫throws ,程序員不會拋出異常。 程序員只是在聲明該方法可能引發此異常,並且方法的調用者必須以某種方式處理它

舉個例子:

public static void main(String [] args) throws IOException

這很可能是程序員添加的,因為他的程序從另一個類中聲明了該方法的另一個類調用了某個方法。 一些常見的示例是:

public FileWriter(String fileName) throws IOException // a constructor can also throw exceptions
FileWriter.write(int c) throws IOException

FileWriter類的設計器已使其用戶(程序員)必須處理IOException 這稱為檢查異常

兩種例外

一個已檢查的異常告訴用戶,在程序運行期間, 即使通常不應該發生, 可能導致該異常的情況發生(因為我們不生活在理想的世界中)。 這表明存在環境錯誤 ,即使在最佳程序中也可能引發此類異常。

異常的另一種類型是未檢查的異常 您不使用throws聲明NullPointerException (未經檢查的異常)的原因是,導致這種情況的情況在正常程序運行期間不會發生。 如果發生這種情況,則表明存在編程錯誤編寫錯誤的程序。

您如何處理異常?

有兩種方法可以處理方法中接收到的異常。

首先是程序員在您的示例中所做的方式。 只需將該異常返回給調用方即可。

其次是使用try-catch塊在內部對其進行處理:

public static void main (String [] args) // no need to declare "throws IOException"
{
    try {
        /* some code here that may throw IOException */
    } catch (IOException ioe) {
        System.err.println("Uhhhh something went wrong!");
        // or some logging can happen
        ioe.printStackTrace();
        System.exit(-6); // a custom error signal can be sent in termination
    }
}

但是又為什么呢?

如果不是多余的,人們這樣做的原因是什么?

他們之所以這樣做,是因為Java強制對已檢查的異常進行顯式處理,而未檢查的異常則可以不處理。

正如我已經解釋了可以處理異常的兩種方式一樣,應該指出,程序員可以根據情況選擇一種方式來替代另一種方式。 對於某些方法,將捕獲的異常拋出給調用方可能更有意義,而對於另一些方法,在內部處理捕獲的異常更有意義。

然后就是那些懶惰的程序員,他們只是使用throws聲明每個檢查的異常。

筆記

可以使用以上兩種方式之一來處理已檢查和未檢查的異常。 未檢查的異常為您提供了不處理它的第三種選擇,這又使調用者可以選擇處理還是不處理它。

如果使用throws聲明了一個未檢查的異常,它將成為方法調用者的一個檢查異常。

您還可以混合和匹配兩種方式。 例如,即使在方法簽名中聲明了已檢查的異常,您也可以在方法中的任何時候在內部處理它。 throws聲明僅在未內部處理檢查的異常的情況下才生效。

只需傳入參數的String數組,就可以像程序中的任何其他常規靜態方法一樣調用類的main方法。 僅從某種意義上說,當類作為Java程序啟動時,JVM會調用此方法。 手動調用main方法時,必須處理可能引發的檢查異常。

如果main某些代碼引發了檢查異常 (例如IOException ),則必須throws聲明它。 在這方面, main方法就像普通方法一樣(實際上,在所有方面它像普通方法一樣,不同之處在於它也是程序的入口點)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM