Вышел новый черновик JEP, в котором предлагается улучшить java.lang.NullPointerException
, снабдив его сообщением, объясняющим причину выброса исключения. В этом сообщении будет содержаться информация о том, что именно было null
и какое действие вызвало ошибку.
Например, если в выражении a.b.c.d
поле b
было null
, то сообщение будет примерно следующим:
'a.b' is null. Can not read field 'c'.
Другой пример: выражение – obj.hashCode()
, сообщение:
'obj' is null. Can not invoke method 'java.lang.Object.hashCode()I'.
Генерацию сообщения предлагается сделать с помощью поля backtrace
в объекте исключения, которое является приватным для JVM. Также необходим анализ потока байткода, чтобы восстановить цепочку вызовов, приведших к нулевому объекту. Так как генерация сообщения является недешёвой операцией, то предлагается сделать её ленивой, иначе при каждом выбрасывании NullPointerException
будет выполняться лишняя работа.
Детальные сообщения в NullPointerException
будут чрезвычайно полезными и могут значительно упростить диагностику, особенно в тех случаях, когда цепочки вызовов методов длинные и непонятно, какой именно объект был null
.
Интересно, что такие сообщения могут быть реализованы и без изменений исходного кода JDK. Андрей Паньгин утверждает, что детальные сообщения NPE у них уже есть и они делают это всего лишь в ~100 строк кода.