最近 Android マーケットでゲームをリリースし、今日 ACRA から最初のエラー レポートを受け取りました。例外は次のとおりです。
java.lang.NullPointerException
at com.sweee.db.AndroidDBHelper.java.util.ArrayList getScores()(SourceFile:65)
at sweee.com.screens.HighScoreScreen.void show()(SourceFile:180)
at com.badlogic.gdx.Game.void setScreen(com.badlogic.gdx.Screen)(SourceFile:59)
at sweee.com.screens.LevelDoneScreen.void render$133aeb()(SourceFile:46)
at com.badlogic.gdx.Game.void render()(SourceFile:46)
at com.sweee.main.SweeeMain.void render()(SourceFile:125)
at com.badlogic.gdx.backends.android.AndroidGraphics.void
onDrawFrame(javax.microedition.khronos.opengles.GL10)(SourceFile:452)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1462)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)
ACRA を通じて、デバイスが ICS 4.03 を実行する Acer Iconia A100 であることがわかりました。残念ながら、エミュレーターでエラーを再現できません(インターネットと機内モードに接続してみました)。NPE をスローすると主張する行は、これを行う関数「isConnected()」への呼び出しです。
public boolean isConnected() {
final ConnectivityManager connectManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// Return true if connected, either in 3G or wi-fi
final boolean connected = (connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || connectManager.getNetworkInfo(
ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED);
return connected;
}
私はほとんど無知で、このバグを修正したいと考えています。ICS 4.03 または Iconia A100 に固有の既存のインターネット接続を確認するこの方法に一般的な問題はありますか?
Iconia A100 を所有している誰かが、私に好意を示して、失敗を再現してみてくれませんか? このゲームは、こちらの Android マーケットで無料で入手できます。お時間をいただき、可能な回答やヒントをありがとうございました。
編集:
@Override
public ArrayList<Score> getScores() {
Cursor c = getWritableDatabase().query("scores", null, null, null, null, null, "points DESC");
if (c.moveToFirst()) {
do {
Score s = new Score(c.getString(1), c.getInt(2), getBoolFromInt(c.getInt(3)), getBoolFromInt(c.getInt(4)));
if (!scores.contains(s)) {
scores.add(s);
}
} while (c.moveToNext());
}
if (isConnected()) {
syncDB();
}
return scores;
}
これが NPE を引き起こす機能です。65行目は
if(isConnected()) {
ArrayList スコアは、クラスが取得されたときにインスタンス化されます (アプリの最初の呼び出しの 1 つ。これは前に呼び出されないため、null にすることはできません)。score.contains(s) の呼び出しも add も NPE を引き起こすべきではありませんよね? 私はそれを理解していません。特に、このコードは他の9つのデバイスで正常に動作しているため...
これ以上の助けに本当に感謝します。ありがとう!