Я обнаружил, что предотвращение забвения инициализации объектов не полностью покрыто предупреждением компилятора Java и / или Sonar, я использую последнюю версию Eclipse с последним плагином Sonar.
Я пропускаю ошибку / предупреждение онапример, не инициализируется для Map
(аналогично может быть String
)
В примере Переменная класса mapStatic
и Переменная-член map
, обазакрытый и не окончательный, и может быть объявлен без инициализации и без каких-либо ошибок / предупреждений о NullPointerException
.
Хотя для локальных переменных как mapVar
я получаю ошибку компиляции Compile The local variable mapVar may not have been initialized
Очевидно, что локальные переменные не назначаются со значением по умолчанию , но все же почему компилятор / сонар не делаетне предупреждать об исключении NullPointerException?
Локальные переменные немного отличаются;компилятор никогда не назначает значение по умолчанию для неинициализированной локальной переменной.
private static Map<String, String> mapStatic; // Missing compile/warning
private Map<String, String> map; // Missing compile/warning
public void put() {
map.put("x", "1"); // NullPointerException
//Map<String, String> mapVar;
//mapVar.put("x", "1"); // Compile The local variable mapVar may not have been initialized
}
static {
mapStatic.put("x", "1"); // NullPointerException
}
Также, если я добавлю final
Я получу ошибку компиляции Compile The local variable map may not have been initialized
.
Я нашел ответ , что он не будетбыть во время компиляции, так как можно избежать или найти эти проблемы заранее?
Неудачная инициализация значения является логической ошибкой со стороны программиста и должна быть обнаружена как можно скорее.Java делает это во время компиляции для локальных пользователей, но только во время выполнения (или вообще не) для полей.