1

我最近在安卓市场上发布了一款游戏,今天通过 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 的现有 Internet 连接的方法是否存在一般性问题?

也许拥有 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 分数在类获取时被实例化(应用程序的第一次调用之一,之前没有调用,因此不应为空)。对 score.contains(s) 和 add 的调用都不应该导致 NPE,对吧?我只是不明白。特别是当这段代码在其他 9 台设备上运行良好时......

我真的很感激任何更多的帮助。谢谢!

4

2 回答 2

3

我最近isConnect()在 Acer Iconia A100 中遇到了这个问题

我发现的解决方案正在改变isConnect()如下方法,并且效果很好!

我只是把洞代码放在一个try catch中,当它抛出一个nullPointerException我返回true

你可以在这里看到代码:

    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不存在。这可能是操作系统实施问题吗?大概。

我有一个有点“相似”的情况:我想启动一个活动来处理android.provider.Settings.ACTION_DATA_ROAMING_SETTINGS,并且在我的设备上它可以工作(OS 2.3.7),但在其他一些设备上(OS 版本高于和低于 2.3.7)它没有不工作。这可能是操作系统实施问题吗?最有可能的。

由于您无法重现崩溃,

  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 回答