- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从头开始用 Java 构建我的第一个游戏。我决定集中游戏主要操作(处理输入等)的 GameWorld 类最好作为单例实现(使用枚举)。枚举的相关代码如下。
public enum GameWorld {
INSTANCE;
private static InputController input = InputController.getInput();
public EntityPlayer player = new EntityPlayer(10, 10, 5, 5);
public static GameWorld getWorld() {
return INSTANCE;
}
public InputController getInputController() {
return input;
}
}
异常发生在EntityPlayer的构造函数中。代码和堆栈跟踪如下。
public class EntityPlayer implements Entity, InputListener {
private int xPos;
private int yPos;
private int width;
private int height;
// Velocity of object
// Determines where it sets itself on update
private int xVel;
private int yVel;
private GameWorld world;
private InputController input;
private boolean solid;
public EntityPlayer(int x, int y, int width, int height) {
xPos = x;
yPos = y;
this.width = width;
this.height = height;
solid = true;
xVel = 0;
yVel = 0;
world = getWorld();
input = world.getInputController();
input.registerKeyListener(this);
}
@Override
public Graphics draw(Graphics g) {
g.setColor(Color.yellow);
g.fillRect(xPos, yPos - height, width, height);
return g;
}
@Override
public void update() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int getXPos() {
return xPos;
}
@Override
public int getYPos() {
return yPos;
}
@Override
public Rectangle getRect() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isSolid() {
return solid;
}
@Override
public void kill() {
}
@Override
public GameWorld getWorld() {
return GameWorld.getWorld();
}
@Override
public void sendKeyPress(KeyEvent ke) {
System.out.println(ke.getKeyChar());
}
@Override
public void sendMouseMove(MouseEvent me) {
}
}
堆栈跟踪:
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.pvminecraft.gameworld.Main.<clinit>(Main.java:14)
Caused by: java.lang.NullPointerException
at com.pvminecraft.gameworld.entities.EntityPlayer.<init>(EntityPlayer.java:45)
at com.pvminecraft.gameworld.GameWorld.<init>(GameWorld.java:15)
at com.pvminecraft.gameworld.GameWorld.<clinit>(GameWorld.java:13)
... 1 more
Main.java 的第 14 行是我获取 GameWorld 的另一个实例进行测试。我不确定为什么这会引发异常。如果我删除 EntityPlayer 中对 GameWorld 的引用,它就会消失。如果您需要 Main.java 的代码,请在评论中告诉我,我将发布它。谢谢!
编辑:EntityPlayer 中的第 45 行是“input = world.getInputController();”我很确定世界是空的,尽管我不知道为什么。
最佳答案
你正在让自己陷入困境。
您想要初始化 GameWorld.INSTANCE
变量。在此之前,您必须初始化 GameWorld 类的所有字段。初始化所有字段后,将分配变量INSTANCE
。在此之前,它仍然具有默认值 null
。
在初始化期间,字段player
被初始化。在该初始化中,您已经访问了 INSTANCE 字段。所以你有一个循环依赖。
您确实必须解耦您的类,以便它们变得更加相互独立。
关于Java 单例空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424210/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!