почему исключение нулевого указателя не дает выражения, которое равно нулю?

Если нет такой строки кода, как throw new NullPointerException();, нулевые указатели обычно возникают, когда выполняется операция над выражением, которое оказывается null. Итак, мой вопрос: почему сообщение для нулевого указателя не содержит выражение, которое возвращает ноль?


person MozenRath    schedule 12.03.2013    source источник
comment
Не могли бы вы опубликовать пример, чтобы проиллюстрировать то, что вы пытаетесь спросить? Трассировка стека действительно предоставляет номер строки, в которой происходит исключение.   -  person Vaishak Suresh    schedule 12.03.2013
comment
Перед лицом оптимизации и т. д. все, что обычно известно во время выполнения, это то, что эта вещь, которая должна была быть ссылкой, на самом деле null. Эта ссылка могла быть вычислена в другом месте в любой момент в прошлом.   -  person Damien_The_Unbeliever    schedule 12.03.2013


Ответы (2)


Я не знаю точно, но я предполагаю, что причина в том, что могли бы быть серьезные проблемы с производительностью, если бы JVM должна была иметь возможность сообщать точное выражение, вызвавшее исключение.

По крайней мере, это потребует изменений в формате файла класса, чтобы включить (действительно) подробную информацию о позиции исходного кода... более точную, чем номера строк.

В любом случае, вопрос спорный... потому что это не так.

person Stephen C    schedule 12.03.2013
comment
Просто потому, что Java — это язык программирования, я не перестаю сомневаться в его реализации! - person MozenRath; 12.03.2013
comment
@MozenRath - Ну, если вам нужен настоящий ответ, вы спрашиваете не тех людей. Спросите команду Java. OTOH, если вы на самом деле ставите под сомнение Java (т.е. критикуете ее), то SO не подходит для этого; см. FAQ. - person Stephen C; 21.07.2013

NullPointerException возникает, когда вы пытаетесь разыменовать null, а не когда вы просто создаете или имеете его. Трассировка стека содержит строку, и это самое лучшее, что может быть, и JVM на самом деле не знает, откуда взялась null, она не отслеживает такие вещи, когда пытается как можно быстрее пройтись по байт-коду.


Если у вас возникли проблемы с отладкой таких ситуаций, вы всегда можете разделить выражение и использовать временную переменную:

String tmp = myObj.getSomething();
String result = tmp.substring(1);

Если 1-я строка выше выдает исключение NullPointerException (с трассировкой стека, показывающей, что оно пришло из этой строки, а не из myObj.getSomething()), вы знаете, что myObj был нулевым. Если 2-я строка выдает исключение NullPointerException, вы знаете, что tmp было нулевым, т.е. myObj.getSomething() вернуло нуль. Если вы затем заметите, что myObj.getSomething() может на самом деле возвращать null в нормальной ситуации, вы можете добавить туда код типа if (tmp != null) { ... } else { ... }.

person hyde    schedule 12.03.2013