gpt4 book ai didi

java - 为什么 PrintStream.close() 最终会被调用两次?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:59 24 4
gpt4 key购买 nike

令我有些吃惊的是,以下代码打印了两次“Close”。通过调试器运行,似乎 MyPrintStream.close() 调用了 super.close(),最终再次调用了 MyPrintStream.close() .

    
import java.io.*;

public class PrintTest
{
static class MyPrintStream extends PrintStream
{
MyPrintStream(OutputStream os)
{
super(os);
}

@Override
public void close()
{
System.out.println("Close");
super.close();
}
}

public static void main(String[] args) throws IOException
{
PrintStream ps = new MyPrintStream(new FileOutputStream(File.createTempFile("temp", "file")));
ps.println("Hello");
ps.close();
}
}

为什么会这样?我不应该扩展 PrintStream 吗?

最佳答案

如果您在调试器中查看您的代码并在 close() 方法中设置断点,它会显示 正在调用您的 的堆栈跟踪>close() 方法:

  1. 你的主要方法
  2. sun.nio.cs.StreamEncoder$CharsetSE.implClose() 第 431 行

后者的完整堆栈跟踪如下所示:

PrintTest$MyPrintStream.close() line: 20    
sun.nio.cs.StreamEncoder$CharsetSE.implClose() line: 431 [local variables unavailable]
sun.nio.cs.StreamEncoder$CharsetSE(sun.nio.cs.StreamEncoder).close() line: 160 [local variables unavailable]
java.io.OutputStreamWriter.close() line: 222 [local variables unavailable]
java.io.BufferedWriter.close() line: 250 [local variables unavailable]
PrintTest$MyPrintStream(java.io.PrintStream).close() line: 307
PrintTest$MyPrintStream.close() line: 20
PrintTest.main(java.lang.String[]) line: 27

遗憾的是,尽管我无法告诉为什么 StreamEncoder 会回调到您的 PrintStream,因为我的 IDE 没有 sun.nio.cs.StreamEncoder 的源附件:( 这是 JDK 6 顺便说一句,如果这很重要的话。

顺便说一下,如果您问这个问题是因为您注意到 close() 方法中的自定义代码运行了两次,那么您真的应该检查是否 this.closingPrintStream.close() 将此设置为 true(并且该类的注释状态为 /* To avoid recursive closing */ )。

关于java - 为什么 PrintStream.close() 最终会被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852838/

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