我已经对这个问题进行了研究,也试图自己弄清楚,但没有运气。所以我决定问问。
基本信息:
有两个班。FBClient
, 和State
. 在FBClient
中,我有一个类型为 的静态变量fbc
,一个StateManager
实例,它只有一些处理State
东西的方法、一些常量和两个 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()
and FBClient.fbc.getFRAME_HEIGHT()
,它会抛出一个NullPointerException
.
如果我System.out.println(getFRAME_WIDTH + " : " + getFRAME_HEIGHT)
在FBClient
课堂上做 a ,它会正确打印出来,但如果我在State
课堂上做(当然FBClient.fbc.
在它之前添加),它会抛出一个NullPointerException
.
如果我制作FRAME_WIDTH
和FRAME_HEIGHT
常量public
,并且我尝试通过执行和从State
类中访问它们,它会抛出一个.FBClient.fbc.FRAME_WIDTH
FRAME_HEIGHT
NullPointerException
如果我尝试FBClient
直接从类访问常量,而不是 getter,它仍然可以正确打印出来。
最后
感谢您抽出宝贵时间,如果您需要更多信息,请在评论中询问我,我会提供。另外,如果问题没有很好地构建/没有很好地解释,我深表歉意。如果是这种情况,请告诉我如何改进它。而且,如果这个问题已经被问过并回答过一次,我很抱歉,我可能错过了,但正如我所说,我做了我的研究。
编辑#1
一条评论建议我打印出一个fbc
值,看看它是否为空。所以我将这行代码添加到State
构造函数中:
if(FBClient.fbc != null) System.out.println("Not null"); else System.out.println("Null");
而且,正如怀疑的那样,它打印出 null。这是为什么?我清楚地在方法中初始化了变量main
......