【问题标题】:Application runs fine on Eclipse emulator but errors on the phone - FroYo应用程序在 Eclipse 模拟器上运行良好,但在手机上出现错误 - FroYo
【发布时间】:2011-02-03 17:31:58
【问题描述】:

我有一个应用程序(虽然我不确定为什么)至少需要 Android 2.2 才能运行,所以在我的手机上安装了 Froyo 后,我测试了该应用程序,虽然它安装并开始运行,但当我执行一个函数,结果如下错误:

“应用程序意外停止。请重试。”

它在同样运行 Froyo 的模拟器上运行良好,所以我无法弄清楚问题出在哪里。 adb logcat 报错如下:

W/dalvikvm(1027): threadid=1: 线程以未捕获的异常退出 (group=0x2aacc8a0)

它给出了一个空指针异常,除了我知道没有空指针异常,因为它在模拟器中工作正常,我可以从 adb logcat 中的 System.out 看到该值不会为空.

有人知道我可以做些什么来解决这个问题吗?

感谢您的宝贵时间!

编辑:这是所要求的堆栈:

W/dalvikvm(861): threadid=1: 线程以未捕获的异常退出 (group=0x2aacc8a0) E/AndroidRuntime(861):致命异常:主要 E/AndroidRuntime(861):java.lang.NullPointerException E/AndroidRuntime(861):在 com.andrWow.wCraftArmory.Armory.updateUI(Armory.java:150) E/AndroidRuntime(861):在 com.andrWow.wCraftArmory.Armory.access$2(Armory.java:140) E/AndroidRuntime(861):在 com.andrWow.wCraftArmory.Armory$carryOutSearch.onPostExecute(Armory.java:282) E/AndroidRuntime(861):在 com.andrWow.wCraftArmory.Armory$carryOutSearch.onPostExecute(Armory.java:1) E/AndroidRuntime(861):在 android.os.AsyncTask.finish(AsyncTask.java:417) E/AndroidRuntime(861):在 android.os.AsyncTask.access$300(AsyncTask.java:127) E/AndroidRuntime(861):在 android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) E/AndroidRuntime(861): 在 android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(861):在 android.os.Looper.loop(Looper.java:123) E/AndroidRuntime(861): 在 android.app.ActivityThread.main(ActivityThread.java:4627) E/AndroidRuntime(861): 在 java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(861):在 java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime(861):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876) E/AndroidRuntime(861):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634) E/AndroidRuntime(861):在 dalvik.system.NativeStart.main(本机方法) W/ActivityManager(123):强制完成活动 com.andrWow.wCraftArmory/.Armory

这是第 150 行附近的代码 - 第二行是第 150 行:

PlayerCharacter toon = worker.getToons().get(latestToon[0] + "&" + latestToon[1]); 
LinkedHashMap<String, LinkedHashMap<String, String>> bM = toon.getCategoryMap("baseStats");

只有当分配“toon”的结果不为空时,它才会走到这一步。使用该键的 getCategoryMap 的结果也不应该为空,因为在创建时使用该键添加值几乎是硬编码的。 getCategoryMap 是一个 getter,它检查 HashMap 是否包含该键,如果没有,它会给 system.out 一个不存在的错误。

已解决编辑:

感谢大家的帮助。 我真的不认为代码有问题,因为我知道它可以在模拟器上运行,并且我也让它在手机上运行过一次,但事实证明这是我的代码有问题。获得 FroYo 后,我对其进行了设置,其中包括添加一个新键盘,该键盘会自动更改第一个字母的大小写,所以这是我没有正确处理大写/小写的问题 - 一个愚蠢的错误。

感谢您的宝贵时间,非常感谢!

【问题讨论】:

  • 嗨,Dave 发布您的堆栈跟踪的更多信息
  • 是的,我们需要更多信息。但是,当您使用模拟器和真实设备时(iPhone、Android、Blackberry、WP7 等都是如此),当应用程序在一个地方工作但在另一个地方不能工作时,这并不奇怪。当两者都能正常工作时,这令人惊讶。
  • 当虚拟机抛出空指针异常时,你不能确定没有空指针异常。显然某处有一个空指针。
  • 感谢您的所有反馈,尽管我不确定它会有多大帮助,但我已经发布了异常堆栈。是的,我猜你对空指针的存在是正确的,我应该说我不知道​​它怎么会是空的。
  • @Dave 您需要向我们展示围绕空指针异常的代码行,例如 Armory.java 的 150 行。请指出具体是哪一行代码。

标签: android eclipse exception emulation android-2.2-froyo


【解决方案1】:

嗯,显而易见的答案是 PlayerCharacter toon = worker.getToons().get(latestToon[0] + "&amp;" + latestToon[1]); 返回 null。

要弄清楚为什么可以将其分解为几个步骤。 latestToon[0] + "&amp;" + latestToon[1] 给你什么?这是你所期望的吗?我假设getToons() 返回某种地图?它的内容是什么?

【讨论】:

  • 谢谢。我喜欢认为是您的提问让我想知道并对此进行测试-这不是模拟器或 FroYo 的错,这是我犯的一个愚蠢的错误。我以为我已经控制了(大写/小写)大小写的参数,但显然不够好,让我失望的是我知道它工作了一次,然后发生了一些变化,问题是我得到了一个新键盘,它会自动为第一个单词加上大写,(我最初认为这是用键盘本身做),但事实就是如此,所以感谢大家的帮助,附上我的原帖。