在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
那么为什么输出序列会随着数组索引而改变。
答案 0 :(得分:6)
这是由于输出被写入不同的文件而发生的。输出0打印到标准输出(fd 1)和标准错误(fd 2)的例外。将标准错误重定向到/dev/null
❯ java base3 2>/dev/null
0
看看你如何在这里得到例外。因此,由于输出写入不同的文件,此处的顺序将无法预测。
答案 1 :(得分:1)
java documentation说Prints 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]);
之间的时间会影响输出的顺序。