FileWriter对象引用未按预期覆盖

时间:2015-11-18 13:07:01

标签: java pointers reference filewriter

我正在与同伴一起进行简单的编码练习,我们偶然发现了这个问题。

程序要求概述了如果第三个命令行参数是“a”,则应将输出文件追加到,而不是替换。

所以,他的代码是这样的:

import java.io.FileWriter;
import java.io.IOException;

public class MyFileWriter {
   public static void main(String[] args) {
       //...
      try {
         FileWriter fw = new FileWriter("testfile");

         if(args[2].equals("a")) {
            fw = new FileWriter("testfile", true);
         } 
         else if(args[2].equals("r")) {
            fw = new FileWriter("testfile");
         }
      } 
      catch(IOException e) {
         System.out.println(e.getMessage());
      }

   }
}

我知道在任何一个if语句之前初始化FileWriter是多余的,但这就是它的设置方式。我们使用第三个命令行参数“a”运行它,并且if语句成功运行。但是,FileWriter对象未按预期附加到文件中。

我们将FileWriter的初始声明更改为以下内容:

FileWriter fw = null;

然后它奏效了。我认为它必须是某种参考或指针问题,但为什么呢?从理论上讲,赋值运算符应该覆盖事物指向的值,因此即使将其初始化为多余,它也应该完全覆盖对象。

任何人都知道为什么这是一个问题?我只是好奇。

1 个答案:

答案 0 :(得分:3)

  

我认为它必须是某种引用或指针问题,但为什么呢?

不,这是您的代码流以及如何调用FileWriter()构造函数的问题。

第一次拨打<{p>中的FileWriter()

try {
     FileWriter fw = new FileWriter("testfile");
     ....

已经覆盖并清除文件,之后再创建另一个旨在附加到其中的FileWriter

...
if(args[2].equals("a")) {
    fw = new FileWriter("testfile", true);   // here, "testfile" was already overwritten
}
...

因此,实际上你附加到一个空文件。

请记住,构造函数可以包含任何类型的程序代码。你甚至不必分配&#34;结果&#34;构造函数调用变量 - 以下将覆盖文件具有相同的效果:

...
new FileWriter("testfile");
....