4

有趣的情况。我有一段代码创建了几个 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 {
}

我没有特别看出这段代码的问题出在哪里,但它会在空测试中引发警告:“空比较总是产生错误:变量 countStream 在这个位置不能为空”。据我所见,我将一个变量初始化为 null,然后尝试创建输出流,但不能保证会发生。忽略警告很容易,但我更想知道编译器是如何得出可以保证成功创建 countStream 的结论

巴拉德

4

3 回答 3

6

编译器能够看到您在那里不能为空,因为:

  1. 在你try初始化它(countStream = new ....)和
  2. 在您的方法中,catch您已经“ return”退出了该方法。

因此,代码 " " 只有在初始化为非 nullif (countStream == null)后才能通过正常流程获得。countStreamZipOutputStream

于 2011-02-25T08:55:06.410 回答
5

当没有Exception时,变量countStream不会为null。当出现异常时,您return util.FILE_SAVE_FAIL和空值检查将不会进行。因此,无论何时执行空值检查,结果都将始终为假。

稍微正式一点:没有任何代码路径可以让执行到达您的空值检查,从而导致在countStream执行检查时为空值。

于 2011-02-25T08:54:29.607 回答
0

我从这段代码中了解到的是 countStream 为空,这就是为什么它发出警告“空比较总是产生假”

如果您调试,您会发现此代码总是转到 else 部分,因为if (countStream == null) {条件未通过。

于 2011-02-25T09:02:25.020 回答