1

最近 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つのデバイスで正常に動作しているため...

これ以上の助けに本当に感謝します。ありがとう!

4

2 に答える 2

3

最近isConnect()、Acer Iconia A100 のメソッドでこの問題が発生しました

私が見つけた解決策は、isConnect()以下のように方法を変更することであり、非常にうまく機能しました!

ホールコードをtry catchに入れただけで、それがスローされたときにnullPointerExceptiontrueを返します

ここでコードを見ることができます:

    public Boolean isConnect() {

    try{
    ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);


    if (cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == etworkInfo.State.CONNECTED
            || cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() ==NetworkInfo.State.CONNECTED) {

        return true;
    } else {
        return false;
    }
    }
    catch(NullPointerException e)
    {
        return true;
    }


}
于 2012-09-03T17:24:23.267 に答える
1

エラーはこの行にあると思います

final boolean connected =
        (connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED 
        || connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED);

これは、(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);null を返すために発生します。

ドキュメントを参照してください。これに Returns: The service or null if the name does not exist.よると、その名前Context.CONNECTIVITY_SERVICEは存在しません。それはOSの実装の問題でしょうか?おそらく。

やや「似たような」状況がありました: を処理するアクティビティを開始したかったのですがandroid.provider.Settings.ACTION_DATA_ROAMING_SETTINGS、私のデバイス (OS 2.3.7) では機能しましたが、他のデバイス (OS バージョン 2.3.7 より上と下) では機能しませんでした。動作しません。それはOSの実装の問題でしょうか?最も可能性が高い。

クラッシュは再現できませんので、

  1. を購入しAcer Iconia A100 with ICS 4.03てテストする
  2. いくつかのトリックを使用します。これにより、次のことを意味します。

次のコードで更新をリリースし、Acer Iconia を使用しているユーザーがアプリを更新することを願っています。

public boolean isConnected() {
    final ConnectivityManager connectManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    // trickery
    if (connectManager == null) {
        throw new RuntimeException("connectManager is null!");
    }
    // end trickery

    // 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;
}

このようにして、この特定のメッセージを含むクラッシュ レポートを取得できます。このようにして、いくつかの結論を導き出すことができます。

connectManagerとにかく、アプリを機能させたいだけの場合は、null.

お役に立てれば。

編集:

または、次の手順を実行します。

public boolean isConnected() {
    // final ConnectivityManager connectManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    final ConnectivityManager connectManager = null;

    // 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;
}

スタックトレースが同じかどうかを確認します。

于 2012-08-01T08:48:48.763 に答える