Я получаю предупреждение сонара A "NullPointerException" could be thrown; "test" is nullable here.
в состоянии if
:
public record Test(String x) {
public static void main(String[] args) {
Test test = new Test("x");
printXLength(test);
}
private static void printXLength(Test test) {
if (Optional.ofNullable(test).map(test1 -> test1.x).isPresent()) {
System.out.println(test.x.length());
}
}
}
Я установил для тестовой переменной значение null и запустил ее, NPE не выдало.
Это ложное срабатывание? Или я что-то упускаю?
вы можете установить свойство x тестового объекта как необязательное.
В этой строке:
if (Optional.ofNullable(test).map(test1 -> test1.x).isPresent())
вызов isPresent()
не проверяет наличие test
напрямую; он проверяет, присутствует ли результат вызова map
— следовательно, он проверяет наличие test
только косвенно. Sonarlint недостаточно умен, чтобы просмотреть весь поток данных и определить, что test
здесь не может быть нулевым.
Попробуйте изменить его на следующее:
private static void printXLength(Test test) {
Optional.ofNullable(test).map(test1 -> test1.x).ifPresent(
x -> System.out.println(x.length())
)
}
ламба-код работает, но означает ли это, что я не могу использовать Optional.ofNullable
с if
и должен вернуться к традиционной проверке нуля: if (test != null && test.x() != null)
?
Если вы хотите использовать if (...isPresent())
, вам придется отключить проверку SonarLint, воспользовавшись комментарием //NOSONAR
так что в основном эта проблема является ложным срабатыванием?
Это можно было бы назвать ложным срабатыванием, хотя было бы несправедливо ожидать, что Sonar это выяснит.
Можете ли вы показать код для тестирования с Null? если параметр
test
равен нулю, test1.x выдаст NPE