[英]Why does exception type affect what will, and won't, compile?
我有兩個版本的代碼。 在第一個版本類型的異常中的哪一個在方法()倒掉- NullPointerException
,在第二版本- Exception
。 但是,第一個版本可以編譯,而第二個版本則不能編譯。 為什么會這樣呢?
public class Demo
{
static void Method()
{
try
{
throw new NullPointerException("error");
}
catch(Exception ex)
{
throw ex;
}
}
public static void main(String argv[])
{
try
{
Method();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
這是第二個版本。
public class Demo
{
static void Method()
{
try
{
throw new Exception("error");
}
catch(Exception ex)
{
throw ex;
}
}
public static void main(String argv[])
{
try
{
Method();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
第一個版本的堆棧跟蹤:
java.lang.NullPointerException: error
at Demo.Method(Demo.java:7)
at Demo.main(Demo.java:18)
這是因為NullPointerException
是所謂的“未經檢查的”異常。 您無需在throws
子句中聲明它們。
但是,偶然的Exception
不會未被選中,並且您確實需要在throws
聲明中進行聲明。 您需要在第二個代碼片段中使Method()
拋出Exception
。
未經檢查的異常是RuntimeException
, Error
和派生類。 NullPointerException
派生自RuntimeException
。
NullPointerException
是RunTimeException
(或未經檢查),不必在編譯時進行處理。 但是, Exception
被視為檢查異常,並且必須由遇到該異常的任何方法捕獲或拋出。
可以通過如下更改方法聲明來修復第二個片段:
static void Method() throws Exception
由於您的方法“ Method()”拋出Exception
,因此您必須在方法簽名上對其進行聲明:
static void Method() throws Exception
它將編譯。 干杯!
嘗試作為第二個示例:
public class Demo
{
static void Method() throws Exception
{
try
{
throw new Exception("error");
}
catch(Exception ex)
{
throw ex;
}
}
public static void main(String argv[])
{
try
{
Method();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
這樣應該可以編譯,
版本1的代碼無法在Java版本6或更低版本中編譯,我想您正在使用Java 7。
Java 7會在編譯時拋出確切的異常類型。 在情況1中,它是運行時異常,沒有在方法的簽名中顯示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.