Если нет такой строки кода, как throw new NullPointerException();
, нулевые указатели обычно возникают, когда выполняется операция над выражением, которое оказывается null
. Итак, мой вопрос: почему сообщение для нулевого указателя не содержит выражение, которое возвращает ноль?
почему исключение нулевого указателя не дает выражения, которое равно нулю?
Ответы (2)
Я не знаю точно, но я предполагаю, что причина в том, что могли бы быть серьезные проблемы с производительностью, если бы JVM должна была иметь возможность сообщать точное выражение, вызвавшее исключение.
По крайней мере, это потребует изменений в формате файла класса, чтобы включить (действительно) подробную информацию о позиции исходного кода... более точную, чем номера строк.
В любом случае, вопрос спорный... потому что это не так.
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 { ... }
.
null
. Эта ссылка могла быть вычислена в другом месте в любой момент в прошлом. - person Damien_The_Unbeliever   schedule 12.03.2013