Избегайте неинициализированных не финальных членов класса / переменная класса - PullRequest
0 голосов
/ 15 октября 2018

Я обнаружил, что предотвращение забвения инициализации объектов не полностью покрыто предупреждением компилятора 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 делает это во время компиляции для локальных пользователей, но только во время выполнения (или вообще не) для полей.

1 Ответ

0 голосов
/ 15 октября 2018

Поведение, которое вы, похоже, ищете, с большей вероятностью выдаст ненужные предупреждения, чем поможет дизайну.

Тот факт, что поля уровня класса получают значение, назначенное JVM по умолчанию, задуман, и этоОК по многим причинам, в том числе:

  • Возможно, что значение поля не будет известно до окончания строительства объекта.Это типично, поскольку многие значения полей устанавливаются только в setters .
  • Возможно, что текущий класс сам не знает, что это за значение.В этом случае ответственность за установку значения лежит вне класса, поэтому предупреждение будет просто раздражением.
  • Что если поле вообще не будет использоваться в текущем классе?

Это та область, где ответственность лежит на разработчике.Только вы знаете порядок выполнения, только вы знаете, от каких данных зависит код, и только вы несете ответственность за тестирование кода и обеспечение его отсутствия ошибок.

...