【发布时间】:2018-07-18 00:39:36
【问题描述】:
我一直在开发 2D 游戏(使用 LibGDX),但在我的 Alpha 测试期间,我在某些设备上遇到了崩溃。从发布前的报告来看,问题如下:
java.lang.NullPointerException:尝试在空对象引用上调用接口方法“void com.badlogic.gdx.audio.Music.setLooping(boolean)”
在 com.bonbon.lubyjump.game.Game.initialiseSounds(Game.java:151)
在 com.bonbon.lubyjump.game.Game.loadSounds(Game.java:147)
在 com.bonbon.lubyjump.game.Game.create(Game.java:102)
atcom.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:311)
在 android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1519)
在 android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
据我了解,setLooping() 只有在没有“Theme.wav”音频文件的情况下才会抛出上述错误。但有些设备运行时没有任何崩溃的事实似乎表明音频文件确实存在。有什么我可能忽略的可能生成NullPointerException 的东西吗?我无法在 Android Studio 中的任何虚拟设备上重新创建错误。
private void loadSounds() {
try {
themeSong = Gdx.audio.newMusic(Gdx.files.internal("Theme.wav"));
gamePlaySong = Gdx.audio.newMusic(Gdx.files.internal("Gameplay.wav"));
jumpSound = Gdx.audio.newSound(Gdx.files.internal("Jump.wav"));
fartSound = Gdx.audio.newSound(Gdx.files.internal("Fart.wav"));
gameOverSound = Gdx.audio.newSound(Gdx.files.internal("GameOver.wav"));
} catch (Exception e) {
e.printStackTrace();
}
initialiseSounds();
}
private void initialiseSounds(){
themeSong.setLooping(true); //This line causes the error
themeSong.setVolume(soundVolume);
themeSong.play();
gamePlaySong.setVolume(soundVolume);
}
【问题讨论】:
-
强烈建议在您的帖子中以格式化文本而不是图像的形式发布代码。
-
没问题,很乐意提供帮助。
-
错误是因为 themeSong 为空。您使用
e.printStackTrace()打印堆栈跟踪,并在此处包含它以查看您捕获的原始错误是什么。 -
@TylerV 如果 themeSong 为空,那不是意味着音乐文件丢失了吗?如果是这样,它应该在所有设备上都崩溃了。但它只在少数几个方面崩溃。另外,我已经包含了堆栈跟踪,但它似乎不是从
e.printStackTrace()打印出来的(因为调用了initialiseSounds()) -
您应该看到之前从致命异常上方的 printStackTrace 打印的一些错误消息。或者,您可以删除 try-catch 以查看那里抛出了什么。
标签: android nullpointerexception libgdx