gpt4 book ai didi

java - 空指针异常 | `this` 内部枚举构造函数导致 NPE

转载 作者:IT老高 更新时间:2023-10-28 20:41:40 26 4
gpt4 key购买 nike

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() 方法正在未构造的枚举上调用。

还有一点,我想在这里补充一点,Platform1Platform2 都试图在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com