2012-03-07 34 views
1

有人測試Android應用程序提交一個堆棧跟蹤我們,看起來像這樣:Android「的暫停(例外X)」堆棧跟蹤

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

的代碼行它指向的是不相關的SQLite的(這是不是Android類,它是我的代碼)。如果你想知道,代碼它指向的行看起來是這樣的:

if (s_arrayList.contains(foo2)) 

所以我能想象這裏發生的一切,唯一的例外是一個空指針......絕對不是一個SQLite例外。

我的主要問題是:「暫停(異常X)」是什麼意思?如果異常發生在另一個線程上,爲什麼Android會報告這個堆棧跟蹤?

更新:

我認爲這個問題與Eclipse的,當它檢測到一個異常,暫停線程做。這仍然沒有回答我的問題,這就是爲什麼Eclipse正好在這個地方掛了這個線程。我發現了一個相關的問題,它討論了這個Eclipse的怪癖。你可以閱讀更多關於它在這裏:

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

+0

也許s_arrayList的類型與foo2的類型不匹配? – bbedward 2012-03-07 21:17:51

+0

用戶可以有不同版本的應用程序嗎? – 2012-03-07 21:56:23

+0

該類型是正確的,我敢肯定,應用程序的版本是相同的。真正的困惑是爲什麼我看到一個SQLiteException,當這行代碼與SQL無關時。 – Otto 2012-03-08 17:10:09

回答

1

我能想象更多的情況。爲了追蹤它,更多的代碼會有幫助。但是,剩下的時間很少

檢查堆棧跟蹤是否真的適合您的代碼版本。

檢查哪種類型的s_arraylist真的是。這可能是一些特殊的代碼,在sqllite上進行後期綁定。不過,我認爲這不太可能,但最好驗證

檢查foo2的類型是否屬實。可能是其hashcode或equals方法直接或間接使用SqlLite。這是我最喜歡的。

+0

Stefan,感謝您的這些想法。我很確定堆棧跟蹤符合我的代碼,並且我不認爲arraylist或foo2類型正在使用SQLite。我認爲這個問題是由於Eclipse在引發異常之前掛起線程造成的,但我仍不清楚Eclipse如何/爲何這樣做。 – Otto 2012-03-19 21:08:48

1

當你的線程拋出暫停 - 異常(就像在你的堆棧跟蹤中),這並不意味着你有一個空指針,這意味着來自其他線程的某個線程調用了Thread.suspend()

+0

這似乎是合理的。我認爲這個問題是Eclipse在處理調試模式時如何處理異常的一個人爲因素,顯然它會掛起線程並顯示不一定是根本原因的堆棧跟蹤。我仍然不明白爲什麼Eclipse會這樣做,以及它如何決定暫停該線程。 – Otto 2012-03-19 21:08:26

+1

有些時候更好的處理日誌然後調試,你總是可以打印**新的異常**並查看所有的堆棧跟蹤 – 2012-03-19 21:28:52