gpt4 book ai didi

java - 调用 getter 时出现 NullPointerException

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:02 26 4
gpt4 key购买 nike

我已经研究过这个问题,也试图自己弄明白,但没有运气。所以我决定问问它。

基本信息:

有两个类。 FBClientState。在 FBClient 中,我有一个类型为 fbc 的静态变量,一个 StateManager 实例,它只有一些方法可以与 一起使用State 东西,一些常量和两个 setter/getter 。在 State 中,我正在尝试初始化一个 BufferedImage

public class FBClient
{
//Static
public static FBClient fbc;

//In init method
private StateManager stateManager;

//Constants
private final int INIT_FRAME_WIDTH = 320, INIT_FRAME_HEIGHT = (INIT_FRAME_WIDTH / 4) * 3, SCALE = 3, FRAME_WIDTH = INIT_FRAME_WIDTH * SCALE, FRAME_HEIGHT = INIT_FRAME_HEIGHT * SCALE;

public static void main(String[] args)
{
try
{
//First call in exception chain:
fbc = new FBClient();
}
catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}
}

private FBClient()
throws IOException
{
//Second call in exception chain:
init();
}

private void init()
throws IOException
{
stateManager = new StateManager();
//Third call in exception chain:
stateManager.addState(new MainMenu((byte) 0, "Main Menu")); //MainMenu is the subclass of State, and the constructor just calls "super(0, "Main Menu")"
}

public int getFRAME_HEIGHT()
{
return FRAME_HEIGHT;
}

public int getFRAME_WIDTH()
{
return FRAME_WIDTH;
}
}

public abstract class State
{
protected final byte ID;
protected final String NAME;
protected final BufferedImage SCREEN;
protected final Graphics2D GRAPHICS;

public State(byte id, String name)
{
this.ID = id;
this.NAME = name;
//Exception cause:
this.SCREEN = new BufferedImage(FBClient.fbc.getFRAME_WIDTH(), FBClient.fbc.getFRAME_HEIGHT(), BufferedImage.TYPE_INT_RGB);
this.GRAPHICS = SCREEN.createGraphics();
}
}

更多信息:

如果我在 BufferedImage 初始化中放入文字,它就可以工作。

如果我在 State 类中初始化两个变量,为它们分配文字并将这些变量放入初始化中,它就可以工作。

如果我没有为这些变量分配文字,而是为它们分配 FBClient.fbc.getFRAME_WIDTH()FBClient.fbc.getFRAME_HEIGHT(),它会抛出一个 空指针异常

如果我在 FBClient 类中创建一个 System.out.println(getFRAME_WIDTH + ": "+ getFRAME_HEIGHT),它会正确打印出来,但如果我在State 类(当然在它之前添加 FBClient.fbc.),它会抛出一个 NullPointerException

如果我将 FRAME_WIDTHFRAME_HEIGHT 设为public 常量,并尝试从 State 访问它们 通过执行 FBClient.fbc.FRAME_WIDTHFRAME_HEIGHT 类,它会抛出一个 NullPointerException

如果我尝试直接访问 FBClient 类中的常量,而不是 getter,它仍会正确打印出来。

最后

感谢您抽出宝贵时间,如果您需要更多信息,请在评论中询问我,我会提供。另外,如果问题构建不当/解释不当,我深表歉意。如果是这样,请告诉我如何改进它。而且,如果这个问题已经被问过并回答过一次,我很抱歉,我可能错过了,但正如我所说,我做了我的研究。

编辑#1

一条评论建议我打印一个 fbc 值,看看它是否为空。所以我将这行代码添加到 State 构造函数中:if(FBClient.fbc != null) System.out.println("Not null"); else System.out.println("Null");而且,正如所怀疑的那样,它打印出 null。这是为什么?我清楚地在 main 方法中初始化了变量...

最佳答案

您指的是 FBClient.fbc 之前它被分配(实际上是在构造函数中,因为 fbc 在构造函数完成工作后被分配)。要修复它,请将 static 添加到最终值,使 getter 静态并使用 FBClient.getFRAME_HEIGHT() 访问它。您不需要非静态最终变量。

关于java - 调用 getter 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15839110/

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