我肯定会在这里阅读其他关于尝试捕捉性能的文章,但我不确定如果我在我的观点中使用它是否正常。
我在我的gameLoop的某些点上使用它。
首先。我正在使用libgdx Stage and Actor
系统。但是当我更改地图时清除舞台,它有时会在舞台上播放NullPointerException
。
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48)
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:202)
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:166)
at com.portaaenigma.screens.GameScreen.render(GameScreen.java:91)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:202)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110)
所以我添加了一个简单的try catch,因为我无法以任何其他方式处理它。我尝试了状态,并在更改地图和清除舞台并添加新怪物时将状态更改为其他内容。但它确实会犯同样的错误。 try catch看起来像这样:
if (this.status == GameStatus.GAME) {
try {
this.figureStage.act(); // figures act <-- this is line 91
} catch (NullPointerException e) {
// catching nullpointer at mapchange
Gdx.app.log(this.getClass().getSimpleName(),
"Nullpointer catched at mapswitch: " + e.getMessage());
}
}
如果这是可以的,我有点困惑,因为我或多或少地看起来像是一个“修复它”的解决方案。它没有任何问题。当我改变地图时,它确实会抛出,但我不明白为什么
我还需要在我的怪物的查找方法中添加一个try catch。如果我进入mapchange,而它在怪物的碰撞检测中突然出界。
好的一般问题是,如果这是一个可以接受的解决方案,或者应该有更好的解决方案吗?
答案 0 :(得分:5)
你是对的。这是一个黑客。黑客可能很好地帮助你取得进步,但在某些时候你需要找出导致你的NPE的原因。
读取堆栈,找到NPE的行,找出哪个指针为空,然后找到一种方法来阻止它为空或添加一个分支以防止该代码运行。
如果在可能的情况下使用有效对象代替null,可能会有所帮助。例如,如果您正在查找不存在的人,请返回NOBODY对象(您自己定义)而不是null。用中性值覆盖所有选择器(获取方法)。