【问题标题】:Android "suspended (Exception X)" stack traceAndroid“暂停(异常X)”堆栈跟踪
【发布时间】:2012-03-25 10:25:44
【问题描述】:

有人测试 Android 应用程序向我们提交了如下所示的堆栈跟踪:

Thread [<21> Thread-31] (Suspended (exception SQLiteException)) 
FooClass.bar(Foo2Class) line: 198

它指向的代码行与 SQLite 无关(它不是 Android 类,它是我的代码)。如果你想知道,它指向的代码行是这样的:

if (s_arrayList.contains(foo2))

所以我能想象到的唯一异常是 NullPointer...绝对不是 SQLite 异常。

我的主要问题是:“暂停(X 例外)”的真正含义是什么?如果异常发生在不同的线程上,为什么 Android 会报告此堆栈跟踪?

更新:

我认为这个问题与 Eclipse 有关,它在检测到异常时暂停了线程。这仍然给我留下了没有答案的问题,这就是为什么 Eclipse 在这个地方暂停了线程。我发现了一个相关的问题,它讨论了 Eclipse 的这个怪癖。您可以在此处阅读更多信息:

Eclipse Android Debugger - Where in my code did I cause the exception?

【问题讨论】:

  • 可能s_arrayList的类型和foo2的类型不匹配?
  • 用户可以有不同版本的应用吗?
  • 类型是对的,我很确定app的版本是一样的。真正的困惑是为什么我会看到 SQLiteException,而这行代码与 SQL 无关。
  • 你能发布完整的堆栈跟踪吗??
  • 好的,这是完整的堆栈跟踪:线程 [ Thread-31](暂停(异常 SQLiteException)) AdReport2.add(AdService2) 行:198 AdReport2.requestCompleted(AdService2) 行:314 AdMaxPosition.fetchAd(NexageContext, Activity, boolean) 行:131 NexageAdFetcher$FetchThread.run() 行:456

标签: android


【解决方案1】:

我可以想象更多的案例。为了追踪它,更多的代码会有所帮助。但是,剩下的时间很少

检查堆栈跟踪是否真的适合您的代码版本。

检查 s_arraylist 到底是哪种类型。可能是一些特殊代码在 sqllite 上进行后期绑定。但是,我认为这不太可能,但最好验证一下

检查 foo2 到底是哪种类型。可能是它的hashcode或者equals方法是直接或者间接使用了SqlLite。这是我的最爱。

【讨论】:

  • 斯特凡,感谢您的这些想法。我很确定堆栈跟踪适合我的代码,而且我认为 arraylist 或 foo2 类型都没有使用 SQLite。我认为这个问题是由于 Eclipse 在抛出异常之前暂停了一个线程,但我仍然不清楚 Eclipse 如何/为什么这样做。
【解决方案2】:

当您的线程抛出挂起异常时(就像在您的堆栈跟踪中一样),这并不意味着您有一个空指针,这意味着来自其他线程的某个人调用了Thread.suspend()

【讨论】:

  • 这似乎是合理的。我认为问题是当您处于调试模式时 Eclipse 如何处理异常的工件,显然它会暂停线程并显示此堆栈跟踪,这不一定是根本原因。我仍然对 Eclipse 为什么这样做以及它如何决定在那时暂停线程感到模糊。
  • 有时使用日志比调试更好,您可以随时打印 new Exception 并查看它的所有堆栈跟踪
猜你喜欢
  • 2011-01-05
  • 2017-08-06
  • 2010-09-13
  • 1970-01-01
  • 2020-06-24
  • 2017-08-09
  • 2018-07-19
  • 1970-01-01
相关资源
最近更新 更多