Я работал над проектом и написал некоторый код, который, как я ожидал, будет работать нормально. Фрагмент был похож

Но, к моему удивлению, я получил 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 г.