Проверка IntelliJ: "Вызов метода может вызвать исключение NullPointerException". Имеет ли смысл предлагаемое исправление?
Я обычно сталкиваюсь со следующим осмотром IntelliJ
private boolean bar() {
return foo().contains("foo"); // Method invocation 'contains' may produce 'java.lang.NullPointerException'
}
private String foo() {
return null;
}
Инспекции кажутся мне подходящими, но одно из (или часто единственно) предлагаемых исправлений от IntelliJ заключается в следующем:
private boolean bar() {
return Objects.requireNonNull(foo()).contains("foo");
}
Предупреждение исчезло. Но я не понимаю, как это помогает вообще? requireNonNull
будет просто бросить то же самое NullPointerException
это было бы брошено в любом случае, когда .contains
был вызван на null
,
Обычно IntelliJ делает значимые предложения, и это обычное дело, так что я здесь упускаю суть?
1 ответ
Обоснование использования Objects#requireNonNull
похоже на возвращение Optional
Вы делаете это, чтобы управлять ожиданиями.
- Когда ты вернешься
Optional<Something>
вместо простоSomething
Вы говорите: "Эй, я знаю этоSomething
значение может отсутствовать, поэтому вместо возвратаnull
и позволяя догадаться, я возвращаюOptional<Something>
вместо этого, чтобы прояснить, что вы должны ожидать, что он может быть не там, и что я ожидаю, что вы проверите, если он там, прежде чем его использовать ". - Когда вы звоните
Objects.requireNonNull(something)
в вашем коде перед использованиемsomething
, вы говорите: "Эй, если вы читаете это, я просто хотел, чтобы вы знали, что я ожидаю этогоsomething
параметр не должен быть нулевым, и я ожидаю, что вы убедитесь, что это не так, прежде чем вызывать этот код; так что вместо того, чтобы просто доверять тебе и прямо звонитьsomething.contains(...)
Я призываюrequireNonNull
прямо здесь и сейчас, чтобы прояснить (на случай, если кто-то из нас пропустил@NotNull
аннотации в объявлении метода)."
Решает ли это проблему? Нет, это не так. IntelliJ не может магически запретить параметру быть нулевым. Но это может заставить любого, кто читает этот код, осознавать, что параметр не должен быть нулевым, и рассуждать о сценариях, где это может произойти.