Я работал над проектом и написал некоторый код, который, как я ожидал, будет работать нормально. Фрагмент был похож
Но, к моему удивлению, я получил Medium Priority Warnings
от findbugs
: RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE: Nullcheck of value previously dereferenced
По сути, он начал жаловаться, что у меня есть ненулевая проверка имени в строке 19
после того, как оно было разыменовано в строке 22
(числа верны, потерпите меня некоторое время), поэтому, если бы значение было нулевым, я бы получил NPE, даже не достигнув этой точки.
Эта ошибка сама по себе была очень запутанной, по крайней мере, для меня. Из того, что я здесь понял, мы создаем Concrete и проверяем, не являются ли оба ввода ненулевыми. Прежде чем он будет инициализирован, мы передаем это значение super, где у нас есть ненулевая проверка имени, и оно устанавливается как значение.
Итак, я пошел и посмотрел на декомпилированный файл .class. Он был расширен как:
public Concrete(
@NonNull final String name,
@NonNull final String address
) {
super(name);
if (name == null) {
throw new NullPointerException("name");
}
this.address = address;
}
Здесь происходило то, что ненулевая проверка применялась после вызова конструктора суперкласса, а не перед его вызовом, чего я не ожидал. Я думал, что ненулевая проверка произойдет до того, как что-либо будет выполнено в теле, но я определенно ошибался.
Lombok — очень полезный инструмент, и он сделал Java намного (на пару тысяч) менее болезненным. Но этот случай снова напомнил мне, что, несмотря ни на что, мы никогда не должны просто предполагать что-то при написании кода.
Это было отличным уроком для меня.
Первоначально опубликовано на https://dev.to 13 ноября 2020 г.