NetBeans中运行同一段Java代码两次输出顺序相反的原因咨询
问题分析与解决方案
这事儿的核心原因在于你同时用了System.err和System.out这两个不同的输出流,它们的缓冲机制不一样,导致输出顺序不稳定。
具体细节:
System.err(标准错误流)默认是无缓冲或行缓冲模式,它会尽可能快地把内容输出到控制台;System.out(标准输出流)默认是块缓冲模式,它会攒够一定量的内容才会一次性输出,或者等到程序结束、手动触发刷新时才会输出内容。
从你的输出结果反推,代码里应该是先调用了System.err.println(obj),之后又用System.out输出了!。第一次运行时,System.err的内容先被输出,随后System.out的缓冲区被触发刷新,输出!;第二次运行时,可能因为程序结束时的缓冲刷新时机差异,System.out的内容先被输出,System.err的内容随后跟上,最终导致顺序反转。
稳定输出的解决办法:
你可以通过以下几种方式让输出顺序固定:
- 统一使用同一个输出流:要么全用
System.out,要么全用System.err; - 若必须同时使用两个流,在每次输出后手动刷新缓冲区,比如调用
System.out.flush()和System.err.flush(); - 把需要输出的内容合并到同一个字符串中,再用单个流输出。
举个修改后的示例代码:
public class check { public String toString(){ String hello="aaaaaa aaaa"; return hello; } public static void main(String[] args) { check obj=new check(); char[] abc=new char[5]; // 统一使用System.out输出 System.out.println(obj); String hello="heaa^qwertyui"; hello.getChars(2, 3, abc, 0); System.out.println("!"); } }
这样无论运行多少次,输出顺序都会稳定保持为aaaaaa aaaa在前,!在后。
内容的提问来源于stack exchange,提问作者Rushabh
相关产品推荐
相关产品推荐

