[英]Exception Handling in JAVA and Use of throws statement
為什么會這樣呢? 這段代碼可以正常編譯,但在運行時會引發異常
public class Except
{
public static void main(String args[])
{
System.out.println("Hey, I am under main");
method();
}
static void method()
{
throw new NullPointerException();
}
}
但是這段代碼沒有編譯
public class Expect
{
public static void main(String args[])
{
System.out.println("Hey, I am under main");
method();
}
static void method()
{
throw new IllegalAccessException();
}
}
為什么會這樣呢?改變異常的類型,第二個代碼沒有編譯。有人可以解釋一下,我在第一個代碼中使用了throw語句,由於它的編譯很好,那么編寫throws語句的用途是什么與方法聲明。 我正在使用jdk 1.8.0_45
NullPointerException
是RuntimeException
的子類,這使其成為未經檢查的異常,該異常不必在throws
子句中進行處理或聲明。
IllegalAccessException
是一個已檢查的異常,因此必須捕獲該throws
或在可能引發該throws
的任何方法的throws
子句中聲明該throws
。
如果添加throws子句,則第二個代碼段將編譯:
static void method() throws IllegalAccessException
{
throw new IllegalAccessException();
}
必須按照try-catch異常處理中的描述明確捕獲或傳播檢查的異常。 未經檢查的異常不必捕獲或聲明為拋出。
Java中的檢查異常擴展了java.lang.Exception類。 未經檢查的異常擴展了java.lang.RuntimeException。
未檢查的例外列表:
ArrayIndexOutOfBoundsException
ClassCastException
IllegalArgumentException
IllegalStateException
NullPointerException
NumberFormatException
AssertionError
ExceptionInInitializerError
StackOverflowError
NoClassDefFoundError
檢查的異常列表:
Exception
IOException
FileNotFoundException
ParseException
ClassNotFoundException
CloneNotSupportedException
InstantiationException
InterruptedException
NoSuchMethodException
NoSuchFieldException
從用戶的角度來看,我想對已檢查和未檢查的異常之間的差額加兩美分。
想象一個簡單的應用程序,用戶在其中注冊一個提供姓名,姓氏和電話號碼的系統。
首先讓我們看一下檢查的異常。 如果用戶在name字段中輸入12312312,則app應該拋出一個已檢查的異常。同樣,如果用戶輸入angelo作為電話號碼,則app也應該拋出一個已檢查的異常。 因為12312312都不是一個人的有效名稱,所以angelo也不是電話號碼。 在這種情況下,我們使用檢查異常。 因為它基本上是用戶錯誤,並具有適當的反饋,所以用戶可以糾正此類錯誤。
另一方面,未檢查的異常不是用戶異常。 對於這種情況,用戶根本無能為力。 例如,與數據庫的連接可能會丟失。 或者,當開發人員為上述示例創建數據庫字段時,他可能會將數據庫中的名稱字段定義為布爾值字段。 (我在這里有點誇張)。
我希望這也會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.