Java считает, что массив может быть нулевым, но я знаю, что это невозможно.
Строго говоря, Java считает, что переменная может быть неинициализирована .Если это не определенно инициализировано, значение не должно быть наблюдаемым .
(Независимо от того, инициализирована ли переменная без вывода сообщений null
или оставлена в неопределенном состоянии , это деталь реализации. Дело в том, что язык говорит, что вы не должны видетьзначение.)
Но в любом случае, решение состоит в том, чтобы инициализировать его как null
.Это избыточно, но нет никакого способа сказать Java «просто доверься мне, оно будет инициализировано».
В вариантах, в которых вы получаете сообщения «Доступ к потенциальному нулевому указателю»:
- Это предупреждение, а не ошибка.
- Вы можете игнорировать или подавлять предупреждение.(Если ваш анализ правильности неверен, в результате вы можете получить NPE. Но это ваш выбор.)
- Вы можете отключить некоторые или все предупреждения с помощью переключателей компилятора.
Выможет подавить определенное предупреждение с аннотацией @SuppressWarnings
:
- Для Eclipse используйте
@SuppressWarnings("null")
. Для Android используйте @SuppressWarnings("ConstantConditions")
.
К сожалению, теги предупреждений не полностью стандартизированы.Однако компилятор должен молча игнорировать @SuppressWarnings
для тега предупреждения, который он не распознает.
Возможно, вы сможете реструктурировать код.
В вашем примере код использует переключение через.Люди редко делают это, потому что это приводит к коду, который трудно понять.Таким образом, я не удивлен, что вы можете найти примеры крайних случаев, включающие раскрытие, где компилятор получает предупреждения NPE немного неправильно.
В любом случае, вы можете легко избежать необходимости выполнять сквозную настройку путем реструктуризации кода.Скопируйте код в корпусе case 2:
в конец корпуса case 1:
.Исправлена.Двигайтесь дальше.
Обратите внимание, что ошибка «возможно, не инициализирована» не является глупостью компилятора Java.Есть целая глава JLS о правилах для определенного назначения и так далее.Компилятору Java не разрешено быть умным, потому что это будет означать, что один и тот же код Java будет легальным или недопустимым, в зависимости от реализации компилятора.Это было бы плохо для переносимости кода.
На самом деле у нас есть язык компромисс дизайна .Язык мешает вам использовать переменные, которые (на самом деле) не инициализированы.Но чтобы сделать это, «тупой» компилятор должен иногда мешать вам использовать переменные, которые, как вы (умный программист), будете инициализировать ... потому что правила говорят, что это должно быть.
(Альтернативы хуже:либо нет проверок во время компиляции неинициализированных переменных, приводящих к серьезным сбоям в непредсказуемых местах, либо проверки, которые различны для разных компиляторов.)