静态方法的执行顺序

Ram*_* .S 13 java static-methods

public class Sample {

    public void method()
    {
        System.out.println("normal hai");   
    }
    public static void method1()
    {
        System.out.println("static hai");
    }
    public static void main(String[] args) {
        Sample s = null;
        s.method1();
        s.method(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Exception in thread "main" java.lang.NullPointerException
        at com.csvfile.sample.main(Sample.java:22)

static hai
Run Code Online (Sandbox Code Playgroud)

为什么订单改变了?它应该输出:

static hai
Exception in thread "main" java.lang.NullPointerException
    at com.csvfile.sample1.main(Sample.java:22)
Run Code Online (Sandbox Code Playgroud)

Bor*_*der 16

你的问题是,Exception打印到System.err当你的代码版画System.out.

所以,如果没有一个命名不好的课程(PascalCase请),我们可以这样做:

public static void main(String[] args) throws Exception {
    final System system = null;
    system.out.println("Odd");
    System.out.println(system.toString());
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

Exception in thread "main" java.lang.NullPointerException
Odd
    at com.boris.testbench.App.main(App.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Run Code Online (Sandbox Code Playgroud)

所以它们实际上是交错的.即输出的顺序未定义,因为有两个输出流被打印到控制台.

将代码更改为:

public static void main(String[] args) throws Exception {
    final System system = null;
    system.err.println("Odd");
    System.err.println(system.toString());
}
Run Code Online (Sandbox Code Playgroud)

产生预期的结果.

您还可以捕获异常并将其打印System.out到达到相同的效果:

public static void main(String[] args) throws Exception {
    final System system = null;
    system.out.println("Odd");
    try {
        System.out.println(system.toString());
    } catch (RuntimeException ex) {
        ex.printStackTrace(System.out);
    }
}
Run Code Online (Sandbox Code Playgroud)

PS我确定你知道这一点,但你永远不应该static在一个实例上调用一个方法class.你应该总是staticclass自己上调用方法.所以在你的例子中,你应该总是:

public static void main(String[] args) {
    sample1 s = new sample1();
    s=null;
    sample1.method1();
    s.method(); 
}
Run Code Online (Sandbox Code Playgroud)


Jen*_*ens 5

这是因为exception打印到STDERR并System.out.println()打印到STDOUT,两个流都不同步.

如果您第二次调用它,订单可以更改.

  • @ Ramaiah.S我写道:"可以"不是"必须" (10认同)