簡體   English   中英

不能使用try / catch塊處理java未經檢查的異常?

[英]can't java unchecked exceptions be handled using try/catch block?

在一個教程中,我發現你的代碼無法處理Unchecked Exception,即我們不能使用try/catch塊,例子是ArrayIndexOutOfBoundsException, NullPointerException.等異常ArrayIndexOutOfBoundsException, NullPointerException. 但是這些異常可以使用try / catch塊來處理。 我想我不清楚這個概念!!

另外我認為throw關鍵字只能用於try/catch block.can throw關鍵字與UncheckedException一起使用?

已檢查和未檢查的異常之間的唯一區別是, 必須使用throws在方法簽名中捕獲或聲明檢查的throws ,而對於未經檢查的throws ,這是可選的。

您的代碼無法處理未經檢查的異常,即我們無法使用try / catch塊

當然,我們可以 - 但我們不必。

另外我認為throw關鍵字只能用於try / catch block.can throw關鍵字與Unchecked Exception一起使用?

請注意,有兩個關鍵字:

  • throw顯式拋出您創建的異常對象。 throw new NullPointerException(); 雖然明確地創建了這個特殊的異常並不常見,但大多數人會認為它的風格很糟糕。
  • throws聲明方法可能拋出該異常。 對於未經檢查的異常,這是可選的,但是可以用於記錄事實(同樣,通常不會聲明throws NullPointerException因為這幾乎是給定的)。

所有未經檢查的異常都可以像檢查的那樣處理 - 如果需要,可以通過聲明方法throws它們來讓它們通過:

public void m() throws RuntimeException {}

或者你可以catch它們:

public void m() {
    try {
        // some code
    } catch (RuntimeException re) {
        // do something
    }
}

應該注意的是,類RuntimeException充當未經檢查的異常的全部(因為所有未經檢查的異常都從它擴展),這與Exception類是已檢查異常的全部捕獲的方式非常相似。

如前所述,唯一真正的區別是,對於已檢查的異常,您必須處理它們(通過讓它們通過或捕獲它們)並且編譯器將確保它 - 另一方面,未經檢查的異常的處理是可選的。

這一切都歸結為每種異常類型的預期用法 - 你應該能夠從已檢查的異常中恢復(或至少在它們發生時對它們做些什么),而對於未經檢查的異常,可能沒有合理的從他們身上恢復的方法。 這當然有點主觀。

它們可以被處理,但你沒有必要 如果你不處理它們,它們將傳播並爬上調用方法堆棧,直到其中一個捕獲它。 如果沒有,程序將崩潰。

通常,底線是如果可以合理地期望客戶端從異常中恢復,那么它應該是一個經過檢查的異常 如果客戶端無法執行任何操作以從異常中恢復,則可以將其作為未經檢查的異常

此外,已檢查的異常對於記錄您希望第三方使用的API非常有用。 當他們知道你的方法可以拋出一個特定的異常時,他們會相應地編碼並處理這個案例。 如果您只使用未經檢查的例外 ,則所有投注均已關閉。

一種常見的模式(有些人不喜歡它,但在某些情況下,當你知道自己在做什么時它是可以的)就是將拋出的已檢查異常包裝到未經檢查的模式中。

try {
   ... code that can throw CheckedException ...
} catch (CheckedException oopsSomethingBadHappened) {
    throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened);
}

考慮差異的一種簡單方法是認為檢查是指編譯。 如果異常是已檢查的異常,編譯器將檢查您的代碼是否拋出異常或在編譯時在try / catch塊中處理它。 對於未經檢查的異常,編譯器不會進行此類檢查。 您可以以相同的方式處理已檢查/未檢查的異常(使用try / catch / throws),區別僅在於編譯器執行的檢查。 這篇文章有一個很好的例子

除紀堯姆外:

  • 未經檢查的異常通常是編程錯誤,如果正確實現(索引超出范圍,空指針,類強制轉換,...​​...)則根本不會發生,因此調用者/用戶通常無法對它們做任何事情。
  • 拋出已檢查的異常,因為它超出了程序員的控制范圍(網絡不可用,文件系統不可用,並發修改,例如重復的主鍵,......)
  • JVM通常會拋出錯誤,應用程序通常必須停止(內存不足,堆棧溢出......)

是的,您可以處理未經檢查的例外但不是強制性的。 實際上它取決於應用程序開發人員。 以下是我認為需要處理甚至未經檢查的異常的可能原因。

  • 如果您的應用程序很大,許多開發人員正在調用彼此的API。 最好處理未經檢查的異常,否則在程序結束時會崩潰,從而停止其他功能。 所以即使是簡單的NullPointerException也可以阻止你的程序運行。

  • 想象一下,你有一個處理用戶數據的調度程序,它是百萬大小的,對於壞數據,你只想打印日志而不是停止為其他好的數據工作。 在這種情況下,如果您沒有處理異常,則一個錯誤的數據可能會阻止您的程序

是的,你可以拋出與unchecked異常throw 是的,您可以在catch塊中捕獲未經檢查的異常。

是的,我們可以處理運行時異常,請檢查下面的代碼

public class Demo {
  static void m1() {
    int a[]=new int [5];
    try {
    a[12]=2;
    }catch(Exception e) {

    }
  }

  public static void main(String[] args) {
    m1();
   try {
    String s=null;

    System.out.println(s.length());
   }catch(Exception e) {

   }
    System.out.println("hello world");
  }
}

暫無
暫無

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

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