Java:null比较总是产生错误:不正确的警告?

K.B*_*rad 4 java zip warnings outputstream

有趣的情况.我有一段代码创建了几个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 {
}
Run Code Online (Sandbox Code Playgroud)

我不特别看到这个代码中的问题所在,但是它会在null测试中抛出一个警告:"Null比较总是产生错误:变量countStream在这个位置不能为null".据我所知,我有一个初始化为null的变量,然后尝试创建输出流,但不保证会发生.忽略警告很容易,但我宁愿知道编译器如何得出结论,保证countStream成功创建

K.Barad

Kel*_*dil 6

编译器能够看到你不能为null,因为:

  1. 在你的try初始化它(countStream = new ....)和
  2. 在你的" catch你已经" return的方法.

因此,代码" if (countStream == null)"只能countStream在初始化为非空之后通过正常流程获得ZipOutputStream.


Ger*_*ies 5

没有异常时,变量countStream将不为null。发生异常时,return util.FILE_SAVE_FAIL将不会执行您和null检查。因此,每当执行null检查时,结果将始终为false。

稍微正式一点:没有代码路径可以通过执行代码执行空检查,从而导致执行检查countStream时为空。