[英]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),區別僅在於編譯器執行的檢查。 這篇文章有一個很好的例子 。
除紀堯姆外:
是的,您可以處理未經檢查的例外但不是強制性的。 實際上它取決於應用程序開發人員。 以下是我認為需要處理甚至未經檢查的異常的可能原因。
如果您的應用程序很大,許多開發人員正在調用彼此的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.