作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
public class Test {
public static void main(String[] args) {
Platform1 p1=Platform1.FACEBOOK; //giving NullPointerException.
Platform2 p2=Platform2.FACEBOOK; //NO NPE why?
}
}
enum Platform1{
FACEBOOK,YOUTUBE,INSTAGRAM;
Platform1(){
initialize(this);
};
public void initialize(Platform1 platform){
switch (platform) {
//platform is not constructed yet,so getting `NPE`.
//ie. we doing something like -> switch (null) causing NPE.Fine!
case FACEBOOK:
System.out.println("THIS IS FACEBOOK");
break;
default:
break;
}
}
}
enum Platform2{
FACEBOOK("fb"),YOUTUBE("yt"),INSTAGRAM("ig");
private String displayName;
Platform2(String displayName){
this.displayName=displayName;
initialize(this);
};
public void initialize(Platform2 platform){
switch (platform.displayName) {
//platform not constructed,even No `NPE` & able to access its properties.
//switch (null.displayName) -> No Exception Why?
case "fb":
System.out.println("THIS IS FACEBOOK");
break;
default:
break;
}
}
}
谁能解释一下为什么在 Platform1
中有 NullPointerException
而在 Platform2
中没有。在第二种情况下,我们如何能够访问枚举对象及其属性,甚至在对象被构造之前?
最佳答案
没错。正如@PeterS 提到的在正确构造之前使用枚举会导致 NPE,因为 values() 方法正在未构造的枚举上调用。
还有一点,我想在这里补充一点,Platform1
和 Platform2
都试图在 switch() 中使用未构造的枚举,但 NPE 仅在 中平台1
。这背后的原因如下:-
public void initialize(Platform1 platform){
switch (platform) {
来自 Platform1
枚举的上述代码在 switch 中使用 platform
枚举对象,其中内部使用了 $SwitchMap$Platform1[]
数组,并且使用 values()
方法来初始化这个数组,从而得到 NPE。但在 Platform2
中,switch (platform.displayName)
是在已初始化的 displayName
上进行比较,并发生字符串比较,因此没有 NPE。
以下是反编译代码的片段:-
平台1
static final int $SwitchMap$Platform1[] =
new int[Platform1.values().length];
平台2
switch ((str = platform.displayName).hashCode())
{
case 3260:
if (str.equals("fb")) {
关于java - 空指针异常 | `this` 内部枚举构造函数导致 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38433869/
我是一名优秀的程序员,十分优秀!