204

以下について調べていますjava.lang.VerifyError

java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature: (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageRe˜̴Mt̴MÚw€mçw€mp:”MŒŒ
                at java.lang.Class.getDeclaredConstructors0(Native Method)
                at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
                at java.lang.Class.getConstructor0(Class.java:2671)

サーブレットがデプロイされている jboss サーバーが開始されたときに発生します。jdk-1.5.0_11 でコンパイルされており、jdk-1.5.0_15 で再コンパイルしようとしましたが、成功しませんでした。つまり、コンパイルは正常に実行されますが、展開すると java.lang.VerifyError が発生します。

メソッド名を変更したところ、次のエラーが発生しました。

java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: (IILjava/util/Collection;Lj    ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageResources ØÅN|ØÅNÚw€mçw€mX#ÖM|XÔM
            at java.lang.Class.getDeclaredConstructors0(Native Method)
            at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357
            at java.lang.Class.getConstructor0(Class.java:2671)
            at java.lang.Class.newInstance0(Class.java:321)
            at java.lang.Class.newInstance(Class.java:303)

メソッド シグネチャがさらに表示されていることがわかります。

実際のメソッド シグネチャは

  private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
                          Collection calendarDays,
                          HashMap bcSpecialDays,
                          Collection activityPeriods,
                          Locale locale, MessageResources resources) throws   Exception {

私はすでにそれを見ようとしましたがjavap、それはメソッドの署名を本来あるべきものにします。

私の他の同僚がコードをチェックアウトし、コンパイルしてデプロイすると、同じ問題が発生します。ビルド サーバーがコードを取得して開発環境またはテスト環境 (HPUX) にデプロイすると、同じエラーが発生します。また、Ubuntu を実行している自動テスト マシンでも、サーバーの起動時に同じエラーが表示されます。

アプリケーションの残りの部分は問題なく動作しますが、1 つのサーブレットが故障しているだけです。どこを見るべきかについてのアイデアは役に立ちます。

4

25 に答える 25

200

java.lang.VerifyError実行時に使用しているライブラリとは異なるライブラリに対してコンパイルした場合の結果になる可能性があります。

たとえば、これは、Xerces 1 に対してコンパイルされたプログラムを実行しようとしたときに発生しましたが、Xerces 2 がクラスパスで見つかりました。org.apache.*(ネームスペース内の) 必要なクラスは実行時に見つかったため、結果ClassNotFoundExceptionではありませんでした。クラスとメソッドに変更があったため、実行時に見つかったメソッド シグネチャがコンパイル時にあったものと一致しませんでした。

通常、コンパイラは、メソッド シグネチャが一致しない問題にフラグを立てます。JVM は、クラスがロードされるときにバイトコードを再度検証し、バイトコードVerifyErrorが許可されるべきではない何かを実行しようとするとスローします。たとえば、返されるメソッドを呼び出して、Stringその戻り値をList.

于 2010-03-25T17:40:48.603 に答える
23

java.lang.VerifyError最悪です。

メソッドのバイトコード サイズが 64kb の制限を超えると、このエラーが発生します。しかし、あなたはおそらくそれに気づいたでしょう。

このクラスがアプリケーションの他の場所 (おそらく別の jar) のクラスパスに存在しないことを 100% 確信していますか?

また、あなたのスタックトレースから、ソースファイルの文字エンコーディング( utf-8?)は正しいですか?

于 2008-09-19T06:58:14.873 に答える
11

Kevin Panko が言ったように、それは主にライブラリの変更によるものです。そのため、場合によっては、プロジェクト (ディレクトリ) の「クリーン」に続いてビルドを行うとうまくいきます。

于 2011-03-03T17:15:01.930 に答える
9

あなたが試みるかもしれない一つのことは-Xverify:all、ロード時にバイトコードを検証し、バイトコードが無効な場合に役立つエラーメッセージを表示することです。

于 2008-09-19T12:14:03.297 に答える
8

ここで説明されているように、ライブラリをインポートしていたプロジェクトを作成することで、Android でこのエラーを修正しましたhttp://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject

以前は、プロジェクトを参照するだけで (ライブラリにするのではなく)、この奇妙な VerifyError が発生していました。

それが誰かを助けることを願っています。

于 2012-12-13T00:17:57.220 に答える
8

VerifyError は、クラス ファイルに、構文的には正しいバイトコードが含まれていることを意味しますが、メソッドの境界を越えるジャンプ ターゲットなど、意味上の制限に違反しています。

基本的に、VerifyError は、コンパイラのバグがある場合、またはクラス ファイルが他の方法で破損した場合 (たとえば、RAM の故障や HD の故障など) にのみ発生する可能性があります。

別の JDK バージョンと別のマシンでコンパイルしてみてください。

于 2010-01-11T12:13:20.720 に答える
5

私の場合、私の Android プロジェクトは、Java 7 用にコンパイルされた別の Java プロジェクトに依存しています。java.lang.VerifyErrorその Java プロジェクトの Compiler Compliance Level を 6.0 に変更した後、姿を消しました。

後で、これが Dalvik の問題であることがわかりました: https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE

于 2013-05-19T11:14:51.830 に答える
4

pack200 がクラスファイルをマングリングしたために、この問題が発生していました。少し検索すると、このJavaバグが発生しました。基本的に、設定--effort=4により問題は解消されました。

Java 1.5.0_17 を使用します (ただし、私が試した Java 1.5 のすべてのバリアントで発生しました)。

于 2009-05-27T21:03:35.820 に答える
3

これは、Oracle の JDK に対してコンパイルされたライブラリをロードしようとしているときに、Android で発生する可能性があります。

これは、 Ning Async HTTP クライアントの問題です。

于 2013-05-10T09:22:57.773 に答える
3

置き換えて、同様の java.lang.VerifyError の問題を修正しました。

        catch (MagickException e)

        catch (Exception e)

ライブラリプロジェクトで定義された場所MagickException(私のプロジェクトが依存している)。

その後、同じライブラリからクラスについて取得しました( https://stackoverflow.com/a/9898820/755804java.lang.NoClassDefFoundErrorに従って修正されました)。

于 2013-04-17T12:37:16.643 に答える
2

エラーを生成する最小限の例

簡単な方法として、 Jasminを使用するか、バイナリ ファイル エディタでバイトコードを手動で編集します。

命令voidなしでメソッドを作成してみましょう ( Java のステートメントによって生成されます)。JVMS はこれを違法としています。returnreturn;

Jasmin では、次のように記述できます。

.class public Main
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
   aload_0 ; Just so that we won't get another verify error for empty code.
.end method

次に、javac Main.jコンパイルjavap -v Mainしたことを示します。

public static void main(java.lang.String[]);
  descriptor: ([Ljava/lang/String;)V
  flags: ACC_PUBLIC, ACC_STATIC
  Code:
    stack=1, locals=1, args_size=1
       0: aload_0

本当に返品指示はありません。

実行しようとすると、次のようjava Mainになります。

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: (class: NoReturn, method: main signature: ([Ljava/lang/String;)V) Falling off the end of the code
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        at java.lang.Class.getMethod0(Class.java:3018)
        at java.lang.Class.getMethod(Class.java:1784)
        at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)

returnJava コンパイラがメソッドに暗黙的なメソッドを追加するため、このエラーは通常 Java では決して発生しませんvoidreturnこれが、mainメソッドに a を追加する必要がない理由です。で確認できますjavap

JVMS

JVMS 7 の 4.5 章で指定されている特定の種類の不正なクラス ファイルを実行しようとすると、VerifyError が発生します。

JVMS は、Java がファイルをロードするとき、クラス ファイルを実行する前に一連のチェックを実行して、クラス ファイルが正常であることを確認する必要があると述べています。

JVMS 7 4.10 には次のように記載されているため、このようなエラーは、Java コードの単一のコンパイルおよび実行サイクルでは生成できません。

Java プログラミング言語のコンパイラは、すべての静的および構造的制約を満たすクラス ファイルのみを生成する必要があります [...]

したがって、最小限の失敗の例を見るには、ソース コードを生成せずに生成する必要がありますjavac

于 2015-04-06T12:49:28.223 に答える
2

私の場合、このブロックを削除する必要がありました:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Fragment.showDialog()メソッド呼び出しの近くでエラーが表示されていました。

于 2014-04-27T16:19:19.837 に答える
1

私の場合、私のプロジェクト A は別のプロジェクトに依存していました。たとえば、X (A は X で定義されたクラスのいくつかを使用していました)。したがって、 A のビルド パスに X を参照プロジェクトとして追加すると、このエラーが発生しました。しかし、参照プロジェクトとして X を削除し、ライブラリの 1 つとして X の jar を含めると、問題は解決しました。

于 2013-07-31T15:03:54.763 に答える
1

このページでヒントが得られるかもしれません - http://www.zanthan.com/itymbi/archives/000337.html

そのメソッドの本体に、javac が検出できない微妙なバグがある可能性があります。ここにメソッド全体を投稿しない限り、診断は困難です。

可能な限り多くの変数を final として宣言することから始めることができます...それは zanthan サイトで言及されているバグをキャッチし、いずれにせよ多くの場合良い習慣です。

于 2008-09-19T06:57:23.567 に答える
1

また、maven を使用したモジュールのインポートが多い場合にも発生する可能性があります。まったく同じ名前 (同じ修飾名) を持つクラスが 2 つ以上存在します。このエラーは、コンパイル時と実行時の解釈の違いが原因です。

于 2015-05-04T12:09:09.383 に答える
1

CGLIB < 2.2 で JRE > 6 を使用すると、同様のエラーが発生する可能性があります。「CGLIB 3.0 にアップグレードする必要がありますか?」を参照してください。Spring SPR-9669 のいくつかの解説。

これは、JRE 6 ですべてが正常に機能し、JRE7 に切り替えるだけで問題が発生する場合に特に当てはまります。

于 2014-09-18T01:30:11.307 に答える
0

ケビンが言及した理由は正しいですが、他の何かに移る前に以下を確認してください。

  1. cglibs私のクラスパスで確認してください。
  2. hibernateクラスパスでバージョンを確認してください。

上記のいずれかの複数のバージョンまたは競合するバージョンがあると、問題のような予期しない問題が発生する可能性があります。

于 2014-12-24T17:13:17.443 に答える