FileWriter 对象引用未按预期被覆盖
FileWriter object reference not being overwritten as expected
我正在与同事一起进行简单的编码练习,我们偶然发现了这个问题。
程序要求概述了如果第三个命令行参数是 "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;
然后就成功了。我认为它必须是某种参考或指针问题,但为什么呢?从理论上讲,赋值运算符应该覆盖事物指向的任何值,因此即使开始初始化它是多余的,它也应该完全覆盖对象。
有人知道为什么这是个问题吗?我只是好奇。
I figured it had to be some kind of reference or pointer issue, but why?
不,这取决于您的代码流以及您如何调用 FileWriter()
构造函数。
在
中第一次调用FileWriter()
try {
FileWriter fw = new FileWriter("testfile");
....
已经覆盖并清除了该文件,之后您再创建另一个 FileWriter
以附加到该文件:
...
if(args[2].equals("a")) {
fw = new FileWriter("testfile", true); // here, "testfile" was already overwritten
}
...
因此,实际上您是在追加到一个空文件。
请记住,构造函数可以包含任何类型的程序代码。您甚至不必将构造函数调用的 "result" 分配给变量 - 以下将具有覆盖文件的相同效果:
...
new FileWriter("testfile");
....
我正在与同事一起进行简单的编码练习,我们偶然发现了这个问题。
程序要求概述了如果第三个命令行参数是 "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;
然后就成功了。我认为它必须是某种参考或指针问题,但为什么呢?从理论上讲,赋值运算符应该覆盖事物指向的任何值,因此即使开始初始化它是多余的,它也应该完全覆盖对象。
有人知道为什么这是个问题吗?我只是好奇。
I figured it had to be some kind of reference or pointer issue, but why?
不,这取决于您的代码流以及您如何调用 FileWriter()
构造函数。
在
中第一次调用FileWriter()
try {
FileWriter fw = new FileWriter("testfile");
....
已经覆盖并清除了该文件,之后您再创建另一个 FileWriter
以附加到该文件:
...
if(args[2].equals("a")) {
fw = new FileWriter("testfile", true); // here, "testfile" was already overwritten
}
...
因此,实际上您是在追加到一个空文件。
请记住,构造函数可以包含任何类型的程序代码。您甚至不必将构造函数调用的 "result" 分配给变量 - 以下将具有覆盖文件的相同效果:
...
new FileWriter("testfile");
....