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
编译器能够看到你不能为null,因为:
try初始化它(countStream = new ....)和catch你已经" return的方法.因此,代码" if (countStream == null)"只能countStream在初始化为非空之后通过正常流程获得ZipOutputStream.
没有异常时,变量countStream将不为null。发生异常时,return util.FILE_SAVE_FAIL将不会执行您和null检查。因此,每当执行null检查时,结果将始终为false。
稍微正式一点:没有代码路径可以通过执行代码执行空检查,从而导致执行检查countStream时为空。