簡體   English   中英

Java中的已檢查和未檢查的異常,這些斷言是真的嗎?

[英]Checked and unchecked exception in Java, are these assertions true?

我對已檢查的異常未經 檢查的異常之間的區別存有疑問。

我知道檢查異常通常表示程序直接控制之外的區域中的無效條件,例如無效的用戶輸入,數據庫問題,網絡中斷,缺少文件等。

我還知道, checked異常Exception抽象類的子類,並且一個方法必須為其實現拋出的所有已檢查異常建立一個策略 (要么將已檢查的異常傳遞到堆棧中,要么以某種方式處理它)。

那么,在實踐中,究竟是什么意味着最后的斷言呢?

我可以簡單地說在編譯時檢查已檢查的異常 這意味着如果一個方法拋出一個已檢查的異常,那么它應該使用try-catch塊處理異常,或者它應該使用throws關鍵字聲明異常,否則程序將給出一個編譯錯誤。 它被命名為已檢查異常,因為在編譯時檢查這些異常。

因此,如果一個方法拋出一個已檢查的異常,我可以用兩種不同的方式處理它:

  1. 我必須把它處理成一個try-catch塊,如下所示:

     try{ //statements that may cause an exception } catch (exception(type) e(object))‏ { //error handling code } 
  2. 使用方法聲明中使用的throws關鍵字,以便顯式指定特定方法可能拋出的異常。 當方法聲明使用throws子句定義了一個或多個異常時,方法調用必須處理所有已定義的異常。

    所以,如果我說錯了斷言,請糾正我, throws關鍵字用於將檢索到的已檢查異常拋出到堆棧的上層(進入調用者) 因此,如果一個方法調用另一個拋出一個檢查過的異常的方法,如果它被拋出,則調用方法必須處理它(例如通過try catch塊)。 這個推理是否正確?

    因此, 檢查異常具有引入緊耦合形式的缺點是正確的,因為如果我有一個方法鏈並且最后一個拋出一個已檢查的異常,或者我將其處理到其父代碼或所有中間方法必須通過方法聲明中的throws關鍵字聲明異常? 這個斷言是否正確?

相反,在編譯時不檢查未經檢查的異常 這意味着如果您的程序拋出未經檢查的異常,即使您沒有處理/聲明該異常,程序也不會給出編譯錯誤。 大多數情況下,由於用戶在用戶程序交互期間提供的錯誤數據而發生這些異常。 程序員可以提前判斷條件,這可能導致這些異常並適當地處理它們。 所有未經檢查的異常都是RuntimeException類的直接子類。

例如,我可以有這樣的情況:

class Example {  
   public static void main(String args[])
   {
    int num1=10;
    int num2=0;
    /*Since I'm dividing an integer with 0
     * it should throw ArithmeticException*/
    int res=num1/num2;
    System.out.println(res);
   }
}

編譯這個類編譯器沒有給我任何錯誤,但是運行它我將獲得一個ArithmeticException tath是一個未經檢查的異常,因為它發生在運行時。

所以我認為開發人員必須處理這種情況,例如:

class Example {  
   public static void main(String args[])
   {
    int num1=10;
    int num2=0;
    /*Since I'm dividing an integer with 0
     * it should throw ArithmeticException*/
    try {
        int res=num1/num2;
    } catch(ArithmeticException e) {
         System.out.println("Division for 0, this is not a good idea !!!");
    }

    System.out.println(res);
   }
}

所以我的懷疑是:

  1. 在我看來,我也可以使用try catch塊來處理未經檢查的異常 那么在已檢查的異常未經 檢查的異常之間存在的try catch塊的使用有何不同? 是否僅使用已檢查的異常我必須使用它(或在方法聲明中使用throws關鍵字)否則我將獲得編譯時錯誤消息?

  2. 此外, 未經檢查的異常會自動傳播到上級進入方法調用的堆棧中嗎?

TNX

關於throws引入的耦合,你是絕對正確的: throws子句中聲明的throws成為方法的公共接口的一部分 (通常意義上的單詞;不考慮Java的接口和公共訪問)。 但是,這種耦合與通過聲明返回類型或方法的參數類型引入的耦合沒有什么不同。 您可以將其視為方法簽名的第三個屬性。

在我看來,我也可以使用try catch塊來處理未經檢查的異常。 那么在已檢查的異常和未經檢查的異常之間存在的try catch塊的使用有何不同?

您當然可以捕獲未經檢查的異常,但您應該在程序的最頂層執行此操作以防止完全崩潰。 未經檢查的異常表示編程錯誤,因此您無法以有意義的方式處理它們。 你能做的最好的就是記錄它們,繼續前進。

此外,未經檢查的異常會自動傳播到上級進入方法調用的堆棧中嗎?

是的,它們以與在throws子句中聲明異常但未捕獲的異常相同的方式執行此操作。

  1. 是。 您可以使用try catch塊來捕獲未經檢查的異常以及檢查異常。

  2. 所有例外情況,無論是已選中還是未選中,如果未被捕獲,都會傳播到下一級別。

不同之處在於,如果一個方法可以拋出一個已檢查的異常E (因為它調用一個throws E的方法,或者因為它直接用throw E拋出它自己拋出它),方法聲明必須使用throws E包含這個信息。

因此,如果要調用可以拋出已檢查異常E的方法,則必須將方法調用放在try塊中或聲明throws E 對於未經檢查的異常,這些是可選的。

大多數情況下,您不應該捕獲未經檢查的異常。

  1. try catch of unchecked和checked例外沒有區別。 正如你所說。

    - 如果方法使用另一個可能拋出已檢查異常的方法,則下列兩項內容之一應該為真:該方法應該包含在try-catch塊中,或者該方法應指定在其方法簽名中拋出此異常。

    - 未經檢查的異常可能不是方法簽名的一部分,即使方法可能拋出它。

  2. 當一段代碼以異常條件的形式遇到障礙時,它會創建類java.lang.Throwable的對象。 Checked和Unchecked Exceptions通過方法調用傳播,因為它們都是子類java.lang.Throwable。

暫無
暫無

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

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