簡體   English   中英

需要更好地解釋 Java 中的 try/catch/throw/throws 異常處理

[英]Need a better explanation for try/catch/throw/throws exception handing in Java

我有點不確定 Java 中的 try/catch、throw 和 throws 之間的區別,每個網站似乎都有一種非人道的解釋方式,我嘗試過 Oracle 網站,但我無法理解他們的解釋,這是正確的?

試着抓

使用 try catch,我想嘗試一段代碼,如果出現問題,請執行此操作。

使用throw,我拋出一個錯誤是因為我想要? 所以如果我想驗證一個用戶的年齡,比如說所有 20 歲以上的人並且用戶不符合要求,我會拋出錯誤嗎?

投擲

使用 Throws 我拋出一個錯誤但其他東西處理異常? 這是另一種方法/類嗎?

試着抓

try
{
    // try to do some actions
}
catch(SomeExceptionType exception)
{
    // if the above actions throw a SomeExceptionType, do these actions
}

正確的。 我們明確地拋出異常。 例如,如果某個方法的調用者違反了您的方法契約,您就可以這樣做。 也許一個論點不能是否定的。

在這種情況下,最好的處理方法是拋出一個異常,停止我們正在做的事情,並允許調用者進一步處理這個問題:

/** Do a thing. myInt must be positive */
void someMethod(Integer myInt)
{
    if (myInt < 0)
    {
        throw new IllegalArgumentException("Can't be negative");
    }
    // do something
}

void myCaller()
{
    someMethod( 1); // won't throw
    someMethod(-1); // will throw
}

投擲

throws在處理檢查異常時用作關鍵字。 這是一種讓調用者知道他們可能需要處理哪些已檢查異常的方法。

這些方法可以決定處理問題(即 try-catch),也可以自己聲明要拋出的相同異常類型以將異常傳播給調用者(等等)

您忘記了一個重點:在 Java 中,編譯器不會以相同的方式處理所有異常。

編譯器確保處理已檢查的異常。
這些異常不是從RuntimeException繼承的,而是從Exception (直接或間接)繼承的。

因此,無論您在代碼中拋出什么或第三個類的方法聲明拋出已檢查異常,您都必須顯式處理它。

你有兩種方法:

  • 捕獲異常

  • 讓異常傳播給調用者

try/catch解決第一種方法,而在方法聲明中指定throws修飾符解決第二種方法。

對於沒有RunTimeException s,您沒有此約束,因為編譯器不會強制您處理它。 如果你願意,你可以處理它們。

暫無
暫無

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

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