Java: нулевое сравнение всегда выдает false: неверное предупреждение? - PullRequest
4 голосов
/ 25 февраля 2011

Интересная ситуация.У меня есть раздел кода, который создает несколько ZipOutputStreams.В качестве проверки безопасности, прежде чем я даже думаю о написании чего-либо, я проверяю, что мои выходные потоки были правильно инициализированы:

ZipOutputStream countStream = null;
File countFile = null;
// other files

try {
    countFile =
    new File(savePath.getCanonicalPath() + savePath.separator + outputTag
        + "_COUNT_OUTPUTS.zip");
    // other files
} catch (Exception e) {
    outputLog.add("UNABLE TO FIND SAVE PATH");
    return util.FILE_INVALID;
}

try {
    // prepare outputs
    if (countFile.exists() == true) {
    countFile.delete();
    } else {
    }
    countStream = new ZipOutputStream(new FileOutputStream(countFile));
    // other files
} catch (Exception e) {
    e.printStackTrace();
    outputLog.add("UNABLE TO CREATE OUTPUT FILES");
    return util.FILE_SAVE_FAIL;
}

if (countStream == null) {
    outputLog.add("UNABLE TO CREATE OUTPUT FILES");
    return util.FILE_SAVE_FAIL;
} else {
}

Я особенно не вижу, в чем проблема в этом коде, но он выдает предупреждение отест null: «Сравнение NULL всегда приводит к ложному результату: переменная countStream не может быть нулевой в этом месте».Насколько я понимаю, у меня есть переменная, инициализированная нулем, затем попытка создания выходного потока, но это не гарантируется.игнорировать предупреждение достаточно просто, но я бы скорее знал, как компилятор приходит к выводу, что countStream гарантированно будет успешно создан

K.Barad

Ответы [ 3 ]

6 голосов
/ 25 февраля 2011

Компилятор может видеть, что вы не можете иметь значение null, поскольку:

  1. в вашем try вы его инициализировали (countStream = new ....) и
  2. в вашем catch вы "return" вышли из метода.

Следовательно, код "if (countStream == null)" может быть получен только через обычный поток после того, как countStream был инициализирован как ненулевой ZipOutputStream.

5 голосов
/ 25 февраля 2011

Если исключений нет, переменная countStream не будет нулевой. Когда есть исключение, вы return util.FILE_SAVE_FAIL и проверка на ноль не будет выполнена. Следовательно, всякий раз, когда выполняется нулевая проверка, результат всегда будет ложным.

Немного более формально: нет кодовых путей, по которым выполнение может достигнуть вашей нулевой проверки, в результате чего countStream будет нулевым при выполнении проверки.

0 голосов
/ 25 февраля 2011

Из этого кода я понял, что countStream имеет значение null, и поэтому он предупреждает, что «нулевое сравнение всегда приводит к ложному результату»

Если вы выполните отладку, вы увидите, что этот код всегда переходит к другой части, потому что if (countStream == null) {условие не проходит.

...