Проверка 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 не может магически запретить параметру быть нулевым. Но это может заставить любого, кто читает этот код, осознавать, что параметр не должен быть нулевым, и рассуждать о сценариях, где это может произойти.

Другие вопросы по тегам