簡體   English   中英

為什么異常類型會影響編譯的內容,而不會影響編譯的內容呢?

[英]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

未經檢查的異常是RuntimeExceptionError和派生類。 NullPointerException派生自RuntimeException

NullPointerExceptionRunTimeException (或未經檢查),不必在編譯時進行處理。 但是, 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.

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