Java Exception NullPointerException в пользовательском исключении - PullRequest
0 голосов
/ 17 ноября 2011

Сегодня я как-то наткнулся на ошибку и пытался ее воспроизвести.

Я считаю, что приведенный ниже код вызовет исключение NullPointerException, поскольку ep не создан, но я не могу его смоделировать

Я считаю, что переменная экземпляра ep равна нулю, когда исключение выдается из основного. Но его запуск не показывает исключение NullPointerException.

Когда генерируется исключение (throw e.getILException(100)), вызывается конструктор MyException.MyException()?

package sg.java.testException;

public class MyException extends Exception {

    Exception ep;

    public MyException() {
        super();
        ep = new Exception();
    }

    public OtherException getILException(long txnId) {
            // the error is here, according to the stacktrace
        return new OtherException(ep, ep.toString());
    }
}

Caller:

public static void main(String args[]) throws OtherException{
        try{
            Car.run();
        }catch (MyException e){
            throw e.getILException(100);
        }
    }

Автомобильные коды:

public class Car {
    public static void run() throws MyException {
        throw new MyException();
    }
}

Я хочу иметь возможность повторить это исключение:

java.lang.NullPointerException
    at sg.java.testException.MyException.getILException(MyException.java:13)
    at sg.java.testException.ExceptionTest.main(ExceptionTest.java:8)

Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

Хорошо, описанное вами поведение будет иметь место, если MyException.ep равно null. Хотя значение инициализируется во время создания экземпляра, оно является закрытой переменной пакета, что означает, что некоторый другой класс в sg.java.testException может потенциально установить для ep значение null.

Я бы посмотрел, есть ли у вас код в этом пакете, который может это делать. Простой способ сделать это, если у вас есть доступ ко всему исходному коду, - просто сделать ep приватным или окончательным. Если вы сделаете это, вы должны начать видеть ошибки компиляции, когда ep изменяется.

2 голосов
/ 17 ноября 2011

Когда генерируется исключение (throw e.getILException (100)), вызывается конструктор MyException.MyException ()?

Нет. Это называется до этого. Оператор throw e.getILException(100) вызывает метод getILException(...), а затем throw s, независимо от того, что возвращается из метода.

Я закомментирую строку ep = new Exception(); в конструкторе MyException.

class OtherException extends Exception {
    OtherException(Exception ex, String exStr) {}
}

class MyException extends Exception {

    Exception ep;

    public MyException() {
        super();
        // ep = new Exception();
    }

    public OtherException getILException(long txnId) {
            // the error is here, according to the stacktrace
        return new OtherException(ep, ep.toString());
    }
}

public class Test {
    public static void main(String args[]) throws OtherException {
        try{
            throw new MyException();
        }catch (MyException e){
            throw e.getILException(100);
        }
    }
}

Ниже приводится результат.

Exception in thread "main" java.lang.NullPointerException
at MyException.getILException(Test.java:16)
at Test.main(Test.java:25)
1 голос
/ 17 ноября 2011

Вы получите NPE только тогда, когда ваш метод car.run() вызывает исключение.Этот путь кода запущен?

Одна проблема может заключаться в том, что MyException имеет другие конструкторы, которые не инициализируют ep, или может иметь подкласс, который не имеет ep.

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