В Java объекты по умолчанию инициализируются до null
.Написание кода без использования пула
Недавно я наткнулся на этот ответ, делая исследование обработки NPE правильно: https://softwareengineering.stackexchange.com/a/187225
Ниже мой основной вынос от должности:
Если вы не установите переменную NULL вам никогда не может иметь неожиданный нуль.
Не допускать нулевые параметры
Я задавался вопросом, как справиться с этим в Java и Android. Многие из отчетов о сбоях, которые я вижу на панели инструментов разработчика, это NPE, и я заметил, что в своем коде я использую null
, чтобы проверить, могу ли я продолжить операцию.
Я прочесываю мои кодовый пытаюсь удалить null
и по умолчанию экземпляра как можно больше, но я бег в нескольких районов, где это появляется невозможно, и я не знаю, как исправить ошибки, которые возникают из этих переменных.
Например, при использовании API Карт Google необходимо объявить объект GoogleMap
. Способ, которым я в настоящее время настроен, - объявить переменную как член моего Activity
, а затем инициализировать ее во время onCreate()
. К сожалению, в течение onResume()
, когда я звоню .clear()
на GoogleMap
, изредка поле будет null
. Я не могу воспроизвести эту ошибку в своей собственной среде, что привело меня к тому, что я больше занимался обработкой NPE.
В другом (очень популярном) поле здесь: Avoiding != null statements, В верхнем и принятом ответе предлагаются три стратегии для решения этой проблемы.
assert
заявление. На первый взгляд, это больше похоже на код unit-testing/debug, тем более что Java игнорируетassert
по умолчанию.- Null объект шаблон. Это, вероятно, самый привлекательный из представленных решений, поскольку он заканчивается тем, что выглядит и чувствует себя чище. Однако, работая с внешними библиотеками, я не уверен, что это вариант. Расширение внешней библиотеки кажется беспорядочным.
- Попытка/улов. Это просто сложно. Так как
null
настолько распространен в Java, этот код в конечном итоге плотно переплетается с try/catch для всего, что может быть нулевым, или заканчивается тем, что блокировки кода блокированы, что ошибки ловушки не позволят значительно повысить точность обработки последствий ,
Вопрос в том, есть ли другой вариант? Может быть, парадигма кодирования, которую я могу использовать, или какой-то встроенный модуль, который может это исправить?
Оптимально, я хотел бы получить решение, в котором я не потерпит крах, не потеряю надежность данных или не потеряю функциональность приложения.
Примечания - Это не вопрос о проблемах с кодом, это вопрос о том, как защитно писать код, чтобы предотвратить неожиданный NPE в языке, где инициализация по умолчанию является null
.
Также проверьте [Дополнительно] (https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html) «Конструкция», введенная (наконец) в Java 8 –
Почему очистка карта сделает его нулевым? @ ɐuıɥɔɐɯ не эксперт Android, но не уверен, что вы можете использовать его в Android SDK – Dici
Очистка карты не делает ее нулевой. По какой-то причине иногда отображение * уже имеет значение NULL, когда достигается оператор '.clear()'. – nukeforum