java - 静态方法的执行顺序

标签 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(); 
    }
}

输出是:

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

static hai

为什么顺序变了?它应该输出:

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

最佳答案

您遇到的问题是 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());
}

我得到的输出是:

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)

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

将代码更改为:

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

产生期望的结果。

您也可以捕获异常并将其打印到 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);
    }
}

P.S. 我相信你知道这一点,但你永远不应该在 class 的实例上调用 static 方法。您应该始终在 class 本身上调用 static 方法。所以在你的例子中,你应该总是这样做:

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

关于java - 静态方法的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932093/

相关文章:

java - 找到重复的主键时替换行

java - 如何在Java JUnit中将这两个RunWith结合起来?

Java:可变参数声明的构造函数

Javascript - 不能对非静态函数进行静态引用

Java 静态字段初始化

python - 为什么使用 classmethod 而不是 staticmethod?

java - org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'projectTaskRepository'

java - 为什么 images.google.com GET 请求具有如此不可读的形式?

PHP:保留静态方法并保持可测试性

Java Pattern 类没有公共(public)构造函数,为什么?