我最近在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市场上免费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)。 既不是对score.contains的召唤也不是添加会导致NPE,对吗? 我只是不明白。特别是这个代码在其他9个设备上正常运行......
我真的很感激你的帮助。谢谢!
答案 0 :(得分:3)
我最近在Acer Iconia A100中使用isConnect()
方法遇到了此问题
我发现的解决方案正在改变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;
}
}
答案 1 :(得分: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。
查看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),但是在其他一些设备上(OS版本和低于2.3.7)它没有用。这可能是操作系统实施问题吗?最有可能。
由于您无法重现崩溃,
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;
}
并查看堆栈跟踪是否相同。