不可否认,我的问题与此问题基本相同,但似乎没有答案:
NullPointerException in handleStopActivity -- No reference to my code in stack trace
在上周内下载了Eclipse Helios,Android Developer Tools插件和JDK。我正在搞乱我的设备上的应用程序,在调试模式下运行它,它意外终止。我意识到我造成了一个NullPointerException并且问题本身不是很长时间的问题。
然而,问题是调试器似乎无法识别我的代码中抛出异常的位置。堆栈跟踪不会引用我的代码。
的确,如果我在OnCreate()
方法中加入以下内容,我会遇到同样的问题
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//lI("onCreate()"); //A silly logging thing I messed around with
Integer iDareYou = null;
iDareYou.byteValue();
值得称赞的是,Eclipse当然警告我,代码可能会在我脸上爆炸。但是当我在我的设备上实际运行它时,返回的堆栈跟踪如下:
Thread [<1> main] (Suspended (exception RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2787
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2803
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 135
ActivityThread$H.handleMessage(Message) line: 2136
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 144
ActivityThread.main(String[]) line: 4937
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 868
ZygoteInit.main(String[]) line: 626
NativeStart.main(String[]) line: not available [native method]
我在周围搜索了一些答案,不幸的是,我能想到的是“为什么我的Android应用程序会导致NullPointerException”?多种。
我希望找到我应该做的不同,以便能够在我的代码中找到导致异常的地方....因为我确信这种能力会派上用场指出未来!
要编辑此内容以添加一些信息。正如下面提到的第一条评论,调试器挂起线程的状态不是应用程序的“最终”状态。按“resume”几次会将进程移动到进程实际终止的位置,但遗憾的是Eclipse / ADT Debug窗口中没有显示有用的堆栈跟踪。 然而,此时我粘贴在 Followed By 上面的堆栈跟踪我的代码中NPE的堆栈跟踪的前3个唯一行被输出到LogCat。我之前看过LogCat是否有我可以使用的东西,但很可能是在我在调试器中按下'resume'之前将进程移动到这个状态。不幸的是,这样做从来没有在实际调试器的代码中显示NPE的堆栈跟踪。
但是新闻并不是坏事 - 从右边'变量'窗口的信息中,我可以看到线程的当前范围中有一个NPE,所以这至少会让我知道NPE是继续(当然还有LogCat)。
因此,基于不同主题的建议,我发现的最佳工作是为NullPointerException添加“Caught and Uncaught”断点。当我这样做并重新启动时,调试器会在我的代码中显示NPE的堆栈跟踪,并将编辑窗口直接移动到我导致NPE的行。
目前我认为这是因为Android框架正在捕获(并且可能会再次抛出)NPE。 看起来最初的困境是由于Eclipse / ADT / DalvikVM调试堆栈跟踪窗口不包含堆栈跟踪中显示的“由...引起的”信息(据我所知) “出现在LogCat 中。我将进一步调查是否可以纠正这种情况:)
我很欣赏Bert F的建议,因为我并不完全清楚线程尚未处于“最终”状态。虽然堆栈跟踪[后来]显示在LogCat中是真的,但我没有在LogCat中“错过”它,因为它还没有在那里,我错过的是点击'resume'会导致堆栈跟踪在LogCat中输出。
即使我最初让调试器在我的代码中使用断点停在该行,但有一个事实是我可以在恢复线程后最终在LogCat中获得堆栈跟踪,这将有效地解决问题。我真正要求的另一件事就是让调试器停在我的代码中的行中导致异常,而不是它被捕获,然后被Android框架重新抛出。但我相信这将是一个不同的问题:)如果我点击LogCat窗口中显示的堆栈跟踪中的相应行,Eclipse将会发送给我。
答案 0 :(得分:2)
我运行了你的确切代码,LogCat给了我以下例外:
Caused by: java.lang.NullPointerException
at mypackage.test.TestActivity.onCreate(TestActivity.java:23)
当然是
iDareYou.byteValue();
语句。这显然是一个美好的一天!
我建议您必须以正确的方式学习如何使用Dalvik Debug Monitor Server。
你发布的日志似乎没用,你搞砸了一些LogCat过滤器(它曾经发生在我身上)?
OFFTOPIC:“我的代码在哪里导致异常?” - 我认为你的问题没有很好的表述。
我认为这个问题的正确名称可能是 - '如何使用Android调试器和LogCat?有些例外没有正确记录!'
答案 1 :(得分:1)
在Eclipse中,Android SDK提供了多个视图。在它上面称为“LogCat”。在那里你可以找到异常堆栈跟踪
答案 2 :(得分:0)
iDareYou.byteValue();
如果要转换,则在Null-Value上调用此问题会导致问题我建议尝试这样做: Сonverting int to byte in android
答案 3 :(得分:0)
根据我的经验,Android会消除在扩充布局时引起的异常。它当然应该报告异常,但显然一些Android开发人员遗憾地决定抓住它并创建一个新的 - 没有将前者添加为cause。我将其视为Android环境的缺陷;因为到目前为止我一直很难接触Android团队,但如果真的困扰我,我会向Google报告。