Я использовал много аннотаций @NotNull/@Nullable
, чтобы включить IDE, чтобы помочь мне узнать потенциал NPE
во время компиляции. Тем не менее, моя новая команда не позволяет использовать аннотации @NotNull/@Nullable
, а также пользовательские аннотации, подобные тем, которые разрешены. В результате я с большей вероятностью буду писать ошибки, вызванные NPE
, чем раньше.
Я попробовал несколько решений:
- Используйте
Optional<T>
в java 8. Однако это не подходит для каждого случая. Обычно не рекомендуется использоватьOptional<T>
как тип полей или аргументов. Также очень огорчает, что сам экземплярOptional<T>
может бытьnull
. Кроме того, трудно управлять потоками управления внутри лямбда-выражений при вызовеifPresent(obj->...)
(это проще в Java 9). И использование слишком большого числаOptional<T>
делает код немного подробным. (UPDATE: К сожалению,Optional<T>
также запрещено использовать сейчас) - Сделайте IDE обработкой каждого unannotated экземпляра как
@Nullable
. Это решение помогает мне выявить некоторые возможные ошибки, однако IDE предложит мне проверить почти все вызовы методов, что очень раздражает, поскольку многие методы предназначены намеренно не возвращатьnull
. - Проверить все вызовы методов. Это жизнеспособное решение, однако оно оказывает сильное влияние на то, что возможность
null
будет проходить везде через вызовы методов. В таких обстоятельствах каждый аргумент метода может бытьnull
, и когда аргумент проверяется на nullity, метод обычно возвращает anull
непрерывно. Наконец, каждый метод "заражен" возможностью получения аргументовnull
и возвратаnull
. - Вызовите
Objects.requireNonNull()
, чтобы предотвратить возникшую проблему. Это немного уменьшает боль во время проверкиnull
. Однако он не гарантирует, что вызывающий абонент не передастnull
в случаях, когдаnull
не разрешено. И как толькоnull
будет передано, запущенная средаNPE
будет гораздо более подвержена разрушению вашего приложения. - Переключитесь на kotlin. Конечно, это не разрешено:)
Есть ли другие предложения по обнаружению NPE во время компиляции (и сохранить мою работу)? Я думаю, что решение этой проблемы можно было бы широко использовать, не только помогая себе, так как не все команды допускают использование аннотаций @NotNull/@Nullable
и Optional<T>
s.