Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 - Fatal编程技术网

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

';这';指针未在Java程序中初始化,java,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) {

我有一个程序如下:

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;
    }
}
当我运行程序时,我得到以下异常:

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
线程“main”java.lang.ExceptionInInitializeError中的异常 位于com.company.Main.getRegionName(Main.java:13) com.company.Color.(Main.java:7) com.company.Color.(Main.java:4) 位于com.company.Main.Main(Main.java:25) 原因:java.lang.NullPointerException 位于com.company.Color.values(Main.java:3) com.company.Main$1(Main.java:13) ... 4更多
原因是什么?当Color类在其构造函数中调用Main.getRegionName(this)时,是否为其初始化了“this”?

您不应该从构造函数内部访问正在构造的对象
System.out.println(Main.getRegionName(this))


当您在构造函数中时,“this”指针未初始化。

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

  • 类加载器加载枚举
    颜色
  • 它为第一个值调用
    Color
    的构造函数
    RED
  • 在构造函数中,调用了方法
    Main#getRegionName
  • 在方法
    Main#getRegionName
    中,
    开关
    将调用
    颜色#值
    ,以获取
    开关
    的枚举值
  • 由于尚未加载
    Color
    值,因此它会被
    NullPointerException
    中断,并传播异常
stacktrace中的这一行注意到了这种行为:

原因:java.lang.NullPointerException
位于com.company.Color.values(Main.java:3)

更多信息:


不,它仍在建造中。这很有趣。在颜色构造函数中打印name()可以打印红色和绿色,但在主函数中打印name只能打印红色。问题是为什么。谢谢@luigimendozabut,我们可以使用“this”指针访问一些内部属性?比如:Color(intid){this.id=id;}?@injoy这种方法一开始似乎很奇怪,不应该使用。为什么创建枚举值时枚举字段必须依赖枚举值?@injoy当然可以,否则枚举中的属性点是什么?我不认为
会返回
null
。只要在枚举构造函数中写入
values()
,就会引发此异常。没有返回任何内容。@LuiggiMendoza不理解您的评论。枚举上有属性是很常见的