';这';指针未在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不理解您的评论。枚举上有属性是很常见的