gpt4 book ai didi

java - FileWriter 对象引用未按预期被覆盖

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:46 28 4
gpt4 key购买 nike

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

程序要求概述了如果第三个命令行参数是“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
}
...

因此,实际上您是在追加到一个空文件。

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

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

关于java - FileWriter 对象引用未按预期被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33780919/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com