我最近在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。不幸的是,我无法在模拟器上重现该错误(尝试连接到Internet和飞行模式)。它声称抛出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 Market here上免费。非常感谢您的宝贵时间以及任何可能的答案或提示。

编辑:

@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分数在类获得时实例化(应用程序的首次调用之一,此调用不会在之前调用,因此不应为null)。
调用scores.contains(s)或add都不会导致NPE,对吧?
我就是不明白。特别是因为此代码在其他9个设备上可以正常运行...

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

最佳答案

我认为错误在这条线上

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。

查看documentation。它说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),但是在其他一些设备上(高于和低于2.3.7的OS版本)它没有用。可能是操作系统实施问题吗?最有可能的。

由于您无法重现崩溃,


购买Acer Iconia A100 with ICS 4.03并对其进行测试
使用一些技巧。我的意思是:


使用以下代码发布更新,并希望您的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;
}


并查看stacktrace是否相同。

10-08 17:11