2011-07-21 80 views
6

裏面一個catch子句我要打印異常的STRACK跟蹤:AbstractMethodError上調用Exception.printStackTrace

try { 
    ... 
} catch (Exception exc) { 
    exc.printStackTrace(); 
    ... 
} 

但在某些情況下,我沒有得到一個堆棧跟蹤,而是看是這樣的:

Exception in thread "pool-1-thread-2" java.lang.AbstractMethodError: java.lang.Exception.printStackTrace()V 
    ... 

通常情況下,如果庫有沒有在運行時在編譯時相同的版本應該不會出現此異常,但在這種情況下,我從Java庫一類的工作。 printStackTrace在Throwable中實現,因此此方法在Exception或任何派生類中不能爲抽象。此外,這個AbstractMethodError並不總是被拋出,有時在這個特定的catch子句中還有其他異常(程序流依賴於來自文件的數據和當前時間,所以有時候其他的東西會發生在我自己的代碼中拋出的ArrayIndexOutOfBoundsExceptions或IllegalStateExceptions而且我會期望而不是奇怪的錯誤)。

所以,問題是:特定的AbstractMethodError怎麼可能發生? PS:我在Linux上使用Eclipse Helios,並使用JDK 1.6.0_24作爲運行時環境來啓動我的應用程序。

編輯:有一個錯字(printStrackTrace),我糾正它。只是寫在腦海裏,與我的問題沒有任何關係。它是(或者應該是)一個獨立的應用程序,沒有Web應用程序,沒有Eclipse RCP應用程序,只是一個普通的舊Java應用程序(或多或少)。這個問題也出現在另一臺計算機上 - 也有Eclipse Helios,也有Fedora Linux,但是JDK 1.6.0_21。

令我驚訝的是確實有可能調用getClass().getName()(但沒有其他方法,我嘗試過),例外是java.lang.ArrayIndexOutOfBoundsException。我只是試圖使用OpenJDK 1.6.0(因爲它已經安裝在我的系統上)並得到不同的結果。而不是投擲AbstractMethodErrorprintStackTrace印刷只是一個空行和getMessage()返回null(而不是拋出錯誤)。所以我不知道到底發生了什麼異常,因爲層次結構上層的try-catch-block捕獲異常只是爲了優雅地停止應用程序的一部分。我可能會在某些點上捕獲這種異常類型,以瞭解它的來源。但這並不能解釋異常本身的奇怪行爲。

編輯2:最後,我跟蹤了這​​個問題。事實證明,這是我昨天在同一條線上發生的一個例外情況,但有時例外本身的表現很奇怪。我在List(更準確地說:ArrayList,使用Collections.unmodifiableList(List)包裝)與-1(即這個索引應該改變的循環內部的初始值,但它不會因爲任何原因)的索引上撥打get(int)。至少現在我知道在哪裏尋找修復ArrayIndexOutOfBoundsException,但我仍然不知道爲什麼異常本身很奇怪。

編輯3:我試過Throwable.class.getMethod("printStackTrace").invoke(exc);代替exc.printStackTrace();並得到了java.lang.NoSuchMethodError: java.lang.Throwable.printStackTrace()V代替java.lang.AbstractMethodError的。我還嘗試使用javacjar(只有一個庫來自例外,因爲手工編譯所有jar非常繁瑣)從shell編譯java文件。結果是一樣的。如果我在該線上扔出一個IndexArrayOutOfBoundsException,堆棧軌跡將被打印得很好。也許我不得不希望這個問題非常罕見,並且永遠不會發生在其他地方。

+0

給他一個休息時間,我敢肯定他知道正確的語法。 –

+0

這是一個Web應用程序嗎?通過Java Web Start安裝的獨立胖客戶端?我們需要更多信息才能提供幫助。 – Perception

+0

聽起來像一個損壞的運行時庫。你能重新安裝Java嗎? –

回答

2

據我所知,您已經在Eclipse Helios中啓動了您的應用程序。這可能是由於使用OSGi和專用類加載器的Eclipse的模塊化原因:用於運行應用程序的ClassLoader層次結構可能導致無效鏈接。它主要依賴於什麼樣的異常類,以及你的應用程序類路徑中包含了哪些jar文件 - 你自己的一個jar可能會與Eclipse本身使用的jar文件衝突。你能提供更多的細節嗎?

我想你用一個「java應用程序」運行配置啓動它。你有沒有選中其中一個複選框,如「包含系統庫」或「包含繼承的主」或其他選項?

順便說一下,您的應用程序最終將作爲獨立的Java虛擬機運行,並且應該在該上下文中運行得非常好。

如果不是這種情況,請使用-verbose:class命令行選項運行java應用程序,並在崩潰前檢查輸出中的最新行,您可能會得到關於衝突庫的信息(與運行時相比,編譯時間不同) 。

+0

是的,Eclipse編譯器可能是問題的一部分,因爲它不是創建類文件的JDK編譯器。用過的jar文件不應該和eclipse衝突,因爲任何包都不應該以'org.eclipse'開始。除此之外,我還使用一些庫文庫(用於數學,日誌等)和我自己的罐子。我不知道這些可能與Eclipse的jar文件衝突的方式。你所說的複選框沒有帶來任何改變。當我使用JDK從命令行運行程序時(導出爲獨立應用程序後),也會出現'AbstractMethodError'。 – Peter

+0

這種類型的錯誤來自編譯時和運行時的不同API版本。其中着名的一個就是像xerces這樣的XML解析器API,自1.5開始就包含在Java運行時中。就你而言,它可能是你的日誌工具包。 因此,在運行應用程序時添加命令行選項'-verbose:class',並在堆棧跟蹤之前查看最新的stdout/stderr行。你會得到關於哪個類試圖導入/加載失敗類的線索。 –

相關問題