Я работал над проектом и написал код, который, как я ожидал, будет работать нормально. Фрагмент был похож на
Но, к моему удивлению, я получил Предупреждения со средним приоритетом
от findbugs
: RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE: Проверка значения на ноль ранее разыменованный
В основном он начал жаловаться, что у меня есть ненулевая проверка имени в строке 19
после того, как он разыменован в строке 22
(цифры верны, потерпите немного), поэтому, если бы значение было равно нулю, я бы получил NPE еще до того, как достиг этой точки.
Эта ошибка сама по себе была очень запутанной, по крайней мере для меня. Из того, что я понял здесь, мы создаем бетон и проверяем, не являются ли оба входных значения ненулевыми. Прежде чем он будет инициализирован, мы передаем это значение super, где у нас есть проверка имени на ненулевое значение, и оно устанавливается как значение.
Итак, я пошел и посмотрел на декомпилированный файл .class. Он был расширен как:
public Concrete( @NonNull final String name, @NonNull final String address ) { super(name); if (name == null) { throw new NullPointerException("name"); } this.address = address; }
Здесь происходило то, что проверка на ненулевое значение была применена после вызова конструктора суперкласса, в отличие от перед его вызовом, чего я бы не ожидал. Я думал, что проверка на ненулевое значение произойдет до того, как что-либо будет выполнено в теле, но я определенно ошибался.
Ломбок – очень полезный инструмент, и он сделал java намного (на пару тысяч больше) менее болезненным. Но этот инцидент еще раз напомнил мне, что, несмотря ни на что, мы никогда не должны просто предполагать что-то при написании кода.
Это было большим уроком для меня.
Оригинал: “https://dev.to/satylogin/how-i-misunderstood-lombok-1k44”