gpt4 book ai didi

java - 为什么本地 PrintWriter 会干扰另一个本地 PrintWriter?

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:00 27 4
gpt4 key购买 nike

在这个程序中,第三个字符串永远不会被打印出来。为什么?

(此 Java 程序在 Ubuntu 10.10 上的 Eclipse Indigo 上运行。)

import java.io.PrintWriter;

public class Tester
{
static void nested()
{
PrintWriter object2 = new PrintWriter(System.out, true);
object2.println("second");
object2.close(); // delete this line to make all strings print
}

public static void main(String[] args)
{
PrintWriter object1 = new PrintWriter(System.out, true);
object1.println("first");
Tester.nested();
object1.println("third");
object1.close();
}
}

最佳答案

通过关闭嵌套的 PrintWriter,您还关闭了嵌入的 System.out 流,这似乎阻止了进一步写入它(尽管我希望一个异常而不是吞咽输出)。

所以整个问题可以简化为:

public class Tester {

public static void main(String[] args) {
System.out.println("first");
System.out.close();
System.out.println("second");
}
}

这在“first” 之后也不再打印,但也不会抛出异常。一个非常快速的调试 session 显示存在对 Sun native 函数的调用,这更难调试。

更新*

这就是罪魁祸首:System.out 属于 java.io.PrintStream 类型,它包含以下可爱方法:

private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}

ensureOpen() 方法确实会抛出一个异常,但它在这里被吞没了,并且设置了 trouble 标志(一个众所周知的反模式)。因此,这会默默地忽略对已关闭流的进一步写入。

关于java - 为什么本地 PrintWriter 会干扰另一个本地 PrintWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971992/

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