裏面一個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(因爲它已經安裝在我的系統上)並得到不同的結果。而不是投擲AbstractMethodError
,printStackTrace
印刷只是一個空行和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
的。我還嘗試使用javac
和jar
(只有一個庫來自例外,因爲手工編譯所有jar非常繁瑣)從shell編譯java文件。結果是一樣的。如果我在該線上扔出一個IndexArrayOutOfBoundsException
,堆棧軌跡將被打印得很好。也許我不得不希望這個問題非常罕見,並且永遠不會發生在其他地方。
給他一個休息時間,我敢肯定他知道正確的語法。 –
這是一個Web應用程序嗎?通過Java Web Start安裝的獨立胖客戶端?我們需要更多信息才能提供幫助。 – Perception
聽起來像一個損壞的運行時庫。你能重新安裝Java嗎? –