我最近在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是否相同。