Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么静态块稍后执行?_Java_Static - Fatal编程技术网

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已经明确提到了)。这个问题的答案(到目前为止)不在我的知识范围之内。因此,我没有编辑它。