Sysout结果的顺序

时间:2015-07-20 07:47:02

标签: java

在Eclipse中练习Java数组时,我遇到了这种奇怪的数组行为。

public class base3 {
    public static void main(String[] args) {
        int arr[]= new int[25];
        System.out.println(arr[0]);
        //System.out.println(arr[25]);
        System.out.println(arr[-10]);
    }
}

输出是:

0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -10
at base3.main(base3.java:6)

但是只要我将第三个sysout的索引从-10更改为-11,输出序列就会改变。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -11
at base3.main(base3.java:6)
0

那么为什么输出序列会随着数组索引而改变。

2 个答案:

答案 0 :(得分:6)

这是由于输出被写入不同的文件而发生的。输出0打印到标准输出(fd 1)和标准错误(fd 2)的例外。将标准错误重定向到/dev/null

时,您可以看到此信息
❯ java base3 2>/dev/null
0

看看你如何在这里得到例外。因此,由于输出写入不同的文件,此处的顺序将无法预测。

答案 1 :(得分:1)

java documentationPrints this throwable and its backtrace to the standard error stream.

我认为您正在查看标准错误和标准输出之间的竞争条件,以便将内容打印到控制台。如果抛出异常ArrayIndexOutOfBoundsException,则不会通过打印到System.out而是System.err来处理。由于两个流都必须共享控制台资源,因此它们访问的顺序决定了打印语句的顺序。

-10到-11的变化不应影响结果。调用System.out.println(arr[0]);System.out.println(arr[-10]);之间的时间会影响输出的顺序。