Java 为什么静态块稍后执行?
附言:Java 为什么静态块稍后执行?,java,static,Java,Static,附言: 由于我之前的代码没有演示该问题,因此该问题已被编辑了几次。对于编辑过的问题,有些答案可能不太合理 我有一个名为Son.java的公共类 package com.t; public class Son extends Father { static int i; static { System.out.println("son - static"); i = 19; } { System.out.pri
由于我之前的代码没有演示该问题,因此该问题已被编辑了几次。对于编辑过的问题,有些答案可能不太合理
我有一个名为Son.java的公共类
package com.t;
public class Son extends Father {
static int i;
static {
System.out.println("son - static");
i = 19;
}
{
System.out.println("son - init-block");
}
public static void main(String[] args) {
//Son s = new Son();
int a[] = new int[2];
System.out.println(a[5]);
}
}
class Father {
static {
System.out.println("f - static");
}
{
System.out.println("f - init-block");
}
}
当我第一次运行程序时:
输出为:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at com.t.Son.main(Son.java:19)
f - static
son - static
f - static
son - static
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at com.t.Son.main(Son.java:19)
然后当我运行这个程序时(输出顺序是随机的)
输出为:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at com.t.Son.main(Son.java:19)
f - static
son - static
f - static
son - static
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at com.t.Son.main(Son.java:19)
我已经读到,类初始化时执行静态
块
但是为什么异常首先出现在这里,然后执行静态块呢
我也在使用Eclipse运行我的程序。
有人能解释一下吗?异常不是首先发生的,您只是首先看到异常的打印输出
如果异常首先发生,您将永远不会看到其余的输出
原因是您在程序中同时向System.err
(来自您的异常)和System.out
输出了数据。这些内容打印到屏幕上的顺序没有定义,因此您可以按不同的顺序获得它们。正如询问者所说的main
属于Son
类,并且扩展了Father
。我对代码做了一点修改,这样就可以编译了
class Father {
static{
System.out.println("f - static");
}
}
public class Son extends Father {
static {
System.out.println("son - static");
}
public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
int a[] = new int[2];
System.out.println(a[3]);
}
}
输出为:-
f - static
son - static
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at kanwal.Son.main(Son.java:20)
它的工作方式正是它应该的
编辑:-
这个答案是在OP编辑问题之前做出的。未捕获异常的堆栈跟踪打印在系统中。err
,这是一个无缓冲流。您将文本打印到System.out
,这是一个缓冲流,在打印堆栈跟踪之前还是之后刷新缓冲区是不可预测的
如果您将所有打印语句更改为System.err
,则输出顺序将成为打印顺序,并且始终是相同的顺序。@Keppil的答案已经确定
我只是想指出一些。。。嗯。。。有趣
OP说:
我正在使用Eclipse运行我的程序
下意识的反应是说“那不相关”。。。但是在这种情况下,我认为它>>是在你的例子中,a索引的最大值是1。因为数组有0的索引。你真的应该提供一个完整的例子,其他人可以尝试重现这个问题。主方法属于哪个类?@Thinker:我们甚至还没有一个场景。您还没有提供完整的程序。我们甚至不知道哪个类包含main
!请编辑您的问题,以便有一段代码可以简单地复制到文本编辑器中,编译并运行。听起来你已经知道了,但出于某种原因,你决定从你的问题中删掉一些:(好吧,我认为标准输出和标准错误的缓冲发生在操作系统级别,而不是Java内部。因此,这是一个关于操作系统的问题,而不是Java问题。这可能归结为操作系统在您运行代码的那一刻正在做什么。根据我在07:29:23Z的评论,这不是Java定义的。完全如此。异常打印到stderr,而静态块打印到stdout。它以“随机”方式输出顺序,因为这取决于运行该程序的人的命运,以决定哪一个真正首先到达控制台。您的答案无法解释为什么输出有时是一个顺序,有时是另一个顺序…这就是OP真正想要的。答案与OP的第三次编辑一致。qu的当前版本estion并不是OP开始时提到的。它在问题的顶部作为注释提到。它肯定不会像现在这样回答问题。因此,到目前为止,否决票是有效的。(请随时更新您的答案…或删除它以从2个否决票中获得-4。您当然会失去剩余的+6,但这是您的选择。)我就随它去吧,看看这个答案能得到多少反对票,也就是说,我对这个问题的回答有多任性(即使OP已经明确提到了)。这个问题的答案(到目前为止)不在我的知识范围之内。因此,我没有编辑它。