'this'指针未在Java程序中初始化

inj*_*joy 4 java

我有一个程序如下:

package com.company;

enum Color {
    RED, GREEN;

    Color() {
        System.out.println(Main.getRegionName(this));
    }
}

public class Main {
    public static String getRegionName(Color region) {
        switch (region) {
            case RED:
                return "red";
            case GREEN:
                return "green";
            default:
                return "false";
        }
    }

    public static void main(String[] args) {
        Main m = new Main();
        Color color = Color.RED;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,我得到以下例外:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.company.Main.getRegionName(Main.java:13)
    at com.company.Color.<init>(Main.java:7)
    at com.company.Color.<clinit>(Main.java:4)
    at com.company.Main.main(Main.java:25)
Caused by: java.lang.NullPointerException
    at com.company.Color.values(Main.java:3)
    at com.company.Main$1.<clinit>(Main.java:13)
    ... 4 more
Run Code Online (Sandbox Code Playgroud)

它是什么原因?当它在构造函数中调用Main.getRegionName(this)时,是否为Color类初始化了'this'?

Lui*_*oza 8

代码的执行可以这样描述:

  • 类加载器加载枚举Color.
  • 它调用Color第一个值的构造函数,RED.
  • 在构造函数中,有一个方法调用Main#getRegionName.
  • 在方法中Main#getRegionName,switch将调用以Color#values获取枚举的值switch.
  • 由于Color尚未加载值,因此它会被a打破NullPointerException,异常会被传播.

stacktrace中的这一行注意到了这种行为:

引起:
com.company.Color.values的java.lang.NullPointerException (Main.java:3)

更多信息: