Почему тип исключения влияет на то, что компилируется, а что нет? - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть две версии кода.В первой версии тип исключения, которое выдается в Method () - 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)

Ответы [ 5 ]

6 голосов
/ 23 декабря 2011

Это потому, что NullPointerException является так называемым «непроверенным» исключением.Вам не нужно объявлять их в предложении throws.

Однако случайный Exception является не снятым, и вам do необходимо объявитьв декларации throws.Вам нужно сделать Method() throw Exception во втором фрагменте кода.

Непроверенными исключениями являются RuntimeException, Error и производные классы.NullPointerException происходит от RuntimeException.

2 голосов
/ 23 декабря 2011

Поскольку ваш метод "Method ()" генерирует Exception, вы должны объявить его в сигнатуре метода:

static void Method() throws Exception

И он скомпилируется.Ура! * * 1005

2 голосов
/ 23 декабря 2011

NullPointerException является RunTimeException (или не проверено) и не требует обработки во время компиляции. Exception, однако, считается проверенным исключением и должно быть перехвачено или выброшено любым методом, который его встречает.

Второй фрагмент можно исправить, изменив объявление метода следующим образом:

static void Method() throws Exception

Непроверенные исключения - Противоречие

1 голос
/ 23 декабря 2011

Код версии 1 не компилируется в Java версии 6 или ниже, я думаю, вы используете Java 7.

Java 7 смотрит на время компиляции с точным типом исключения. в случае 1 это исключение времени выполнения, которое не должно присутствовать в сигнатуре метода.

1 голос
/ 23 декабря 2011

Попробуйте это как второй пример:

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();
        }
    }
}

Это должно скомпилироваться нормально,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...