输入和输出流 - Java

时间:2017-11-02 06:37:51

标签: java

我有以下代码。但我在传递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();
         }
      }
   }

}

3 个答案:

答案 0 :(得分:0)

正如您所知,在try ... finally块中,如果抛出异常,try块的执行将停止,并立即转到finally块。

如果您不首先将流初始化为空值,则可能不会为它们分配任何值,因为在初始化第一个流期间很可能抛出异常:

in = new FileInputStream("input.txt"); // may throw exception

如果抛出异常,inout将不会被初始化(所有局部变量必须先被初始化),所以你不能在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();
        }
    }