Проверка IntelliJ: «Вызов метода может вызвать исключение NullPointerException».Имеет ли смысл предлагаемое исправление? - PullRequest
2 голосов
/ 21 марта 2019

Я обычно сталкиваюсь со следующей проверкой 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 Ответ

2 голосов
/ 21 марта 2019

Причина использования Objects#requireNonNull похожа на причину возврата Optional: вы делаете это, чтобы управлять ожиданиями.

  • Когда вы возвращаете Optional<Something> вместо Something, вы говорите: "Эй, я знаю, что это значение Something может отсутствовать, поэтому вместо того, чтобы возвращать null и дать вам угадать, я вместо этого я возвращаю Optional<Something>, чтобы дать понять, что вы должны ожидать, что его, возможно, там не будет, и что я ожидаю, что вы проверите его, прежде чем его использовать. "
  • Когда вы вызываете Objects.requireNonNull(something) в своем коде перед использованием something, вы говорите: "Эй, если вы читаете это, я просто хотел, чтобы вы знали, что я ожидаю этот параметр something не будет нулевым, и я ожидаю, что вы убедитесь, что это не так, прежде чем вызывать этот код, поэтому вместо того, чтобы просто доверять вам и напрямую вызывать something.contains(...), я вызываю requireNonNull прямо здесь а теперь проясним (на случай, если кто-нибудь из нас пропустил аннотацию @NotNull в объявлении метода). "

Решает ли это проблему? Нет, это не так. IntelliJ не может магически запретить параметру быть нулевым. Но это может заставить любого, кто читает этот код, осознавать, что параметр не должен быть нулевым, и рассуждать о сценариях, где это может произойти.

...