我有以下代码。但我在传递Input.txt文件之前看到" in"和" out"变量设置为null。我们为什么这样做?
package Test;
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
答案 0 :(得分:0)
正如您所知,在try ... finally块中,如果抛出异常,try块的执行将停止,并立即转到finally块。
如果您不首先将流初始化为空值,则可能不会为它们分配任何值,因为在初始化第一个流期间很可能抛出异常:
in = new FileInputStream("input.txt"); // may throw exception
如果抛出异常,in
和out
将不会被初始化(所有局部变量必须先被初始化),所以你不能在finally块中使用它们:
if (in != null) { // in might not be initialized
in.close();
}
让我们看一下发生同样事情的简单情况。
int x;
if ... {
x = 0;
}
System.out.println(x);
如果if语句条件为false,则不分配 x
,因此最后一个print语句会给出编译器错误。
答案 1 :(得分:0)
正如您问题的第一条评论中的答案所示,如果您不初始化它们,则无法确定您的变量包含哪些内容。将它们初始化为null可以保证它们中没有任何内容可以保证这些行不会出现意外行为。这被认为是很好的做法。
答案 2 :(得分:0)
将变量初始化为null允许进行延迟初始化。(仅在需要时初始化) 成员变量通常初始化为null,而局部变量通常不会出现这种情况 当我们需要捕获构造函数可以抛出的异常并在最终caluse中关闭它时,局部变量被初始化为null,如下所示。
FileInputStream in = null;
try {
in = new FileInputStream("input.txt");
// ...
} finally {
if (in != null) {
in.close();
}
}