2012-06-14 29 views
8

關於java.lang.VerifyError異常的一個簡短問題。假如我得到看起來像這樣的錯誤:解釋「不兼容的參數到函數」異常消息

Java call terminated by uncaught Java exception: java.lang.VerifyError:(class: com/.../MyClassName, method: <init> signature: (Ljava/io/Reader;)V) Incompatible argument to function 

你能幫助我理解什麼是「初始化」,什麼「(Ljava/IO /讀卡器;)V)」的部分涉及到?它們看起來不像方法名稱或簽名,但我對Java不太熟悉。謝謝!

回答

7

此錯誤表示在您的代碼中的某處,您嘗試調用構造函數(<init>方法)傳遞錯誤的參數集。預期的參數是一個Reader對象。

這可能意味着您先前編譯了一個類文件,然後以某種方式更改了類定義,而無需重新編譯該類文件。因此,你的代碼試圖調用一個不再存在的函數。嘗試重新編譯代碼,看看是否可以修復它。

希望這會有所幫助!

+0

謝謝!問題是,被初始化的對象的類型確實有兩個構造函數,一個取一個字符串,一個取StreamReader作爲參數。沒有其他版本的類型缺少使用字符串的構造函數。這是奇怪的。我必須找到一種方法來逐步執行此代碼。 – Zoomzoom

+0

我們最終發現加載的java類已經損壞,不得不強制重載所有的類。 – Zoomzoom

3

如果您在應用程序服務器上運行應用程序,則可能是類加載問題。

您針對庫編譯了代碼,當您嘗試運行代碼時,它將針對庫的不同(較舊版本)版本運行。

較舊的庫可能沒有該方法或構造函數。

+0

謝謝。我同意這可能與版本不匹配有關。 – Zoomzoom

0

只是爲了留下不同的原因。

總是在應用程序服務器上(在我的例子中是WildFly 10),您可能會在模塊和EAR庫中加載相同的庫。如果這個庫包含需要由模塊實現的接口,這可能會導致衝突,因爲由兩個不同的類加載器加載的同一個類/接口被認爲是兩種不同的類型。