NoSuchMethodError
Java プログラムを実行するとエラーが発生します。何が問題で、どうすれば修正できますか?
32 に答える
これ以上の情報がなければ、問題を特定することは困難ですが、根本的な原因は、実行時に使用しているものとは異なる、メソッドが欠落しているクラスの別のバージョンに対してクラスをコンパイルした可能性が高いことです。
スタック トレースを見てください... ライブラリ内のオブジェクトでメソッドを呼び出すときに例外が発生する場合は、コンパイルおよび実行時に別のバージョンのライブラリを使用している可能性があります。両方の場所で正しいバージョンを使用していることを確認してください。
作成したクラスによってインスタンス化されたオブジェクトのメソッドを呼び出すときに例外が発生する場合は、ビルド プロセスに問題があるようです。コンパイル時に、実際に実行しているクラス ファイルが更新されていることを確認してください。
私はあなたの問題を抱えていました。これが私がそれを修正した方法です。次の手順は、ライブラリを追加する有効な方法です。最初の 2 つの手順は正しく実行できましたが、「.jar」ファイルをファイル システムから Eclipse プロジェクトの「lib」フォルダに直接ドラッグするという最後の手順を実行していませんでした。さらに、以前のバージョンのライブラリをビルド パスと "lib" フォルダーの両方から削除する必要がありました。
ステップ 1 - ビルド パスに .jar を追加する
ステップ 2 - ソースと javadoc を関連付ける (オプション)
ステップ 3 - 実際に .jar ファイルを「lib」フォルダーにドラッグします (オプションではありません)。
リフレクションの場合は が得られ、NoSuchMethodException
非リフレクション コードの場合は が得られることに注意してくださいNoSuchMethodError
。ある場所と別の場所に直面したとき、私は非常に異なる場所を見に行く傾向があります.
JVM パラメータを変更する権限がある場合、詳細出力を追加すると、どの JAR ファイルからどのクラスがロードされているかを確認できます。
java -verbose:class <other args>
プログラムが実行されると、JVM は次のような標準出力情報にダンプする必要があります。
...
[ファイルから読み込まれた junit.framework.Assert:/C:/Program%20Files/junit3.8.2/junit.jar]
...
Mavenまたは別のフレームワークを使用していて、このエラーがほぼランダムに発生する場合は、次のようなクリーン インストールを試してください。
clean install
これは、オブジェクトを作成し、メソッドがあることがわかっている場合に特に有効です。
これは通常、Java ファイルがクラス ファイルよりも新しい場合にのみ Java ファイルをコンパイルするApache Antなどのビルド システムを使用している場合に発生します。メソッドのシグネチャが変更され、クラスが古いバージョンを使用していた場合、正しくコンパイルされない可能性があります。通常の修正は、完全な再構築を行うことです (通常は、「ant clean」の後に「ant」を実行します)。
これは、あるバージョンのライブラリに対してコンパイルしているが、別のバージョンに対して実行している場合にも発生することがあります。
これは、リフレクションを使用した結果である可能性もあります。クラスをリフレクションし、メソッドを名前で抽出するコードがある場合 (例: with Class.getDeclaredMethod("someMethodName", .....)
)、リファクタリング中などにそのメソッド名が変更されるたびに、パラメーターをリフレクション メソッドに更新して一致させることを忘れないでください。新しいメソッド署名、またはgetDeclaredMethod
呼び出しはNoSuchMethodException
.
これが理由である場合、スタック トレースはリフレクション メソッドが呼び出されたポイントを示す必要があり、実際のメソッド シグネチャと一致するようにパラメーターを更新するだけで済みます。
私の経験では、プライベート メソッド/フィールドを単体テストし、TestUtilities
クラスを使用してテスト検証のためにフィールドを抽出するときに、これが時々発生します。(通常、単体テストを考慮して設計されていないレガシー コードを使用します。)
Web アプリを作成している場合は、コンテナーのグローバル ライブラリ ディレクトリとアプリ内に競合するバージョンの jar がないことを確認してください。クラスローダがどの jar を使用しているかは、必ずしもわからない場合があります。
例えば
- トムキャット/共通/lib
- mywebapp/WEB-INF/lib
これは、それぞれのメソッドがクラスに存在しないことを意味します。
- jar を使用している場合は、逆コンパイルして、それぞれのバージョンの jar に適切なクラスがあるかどうかを確認します。
- ソースから適切なクラスをコンパイルしたかどうかを確認してください。
Eclipse を再起動してアプリケーションを実行することで、このエラーを解決しました。私のケースの理由は、プロジェクトまたは Eclipse を閉じずにソース ファイルを置き換えたためかもしれません。これにより、使用していたクラスのバージョンが異なりました。
元の質問に答えるために。ここのJavaドキュメントによると:
"NoSuchMethodError" アプリケーションがクラス (静的またはインスタンス) の指定されたメソッドを呼び出そうとし、そのクラスにそのメソッドの定義がなくなった場合にスローされます。
通常、このエラーはコンパイラによってキャッチされます。このエラーは、クラスの定義が非互換に変更された場合にのみ、実行時に発生する可能性があります。
- 実行時に発生する場合は、メソッドを含むクラスがクラスパスにあることを確認してください。
- 新しいバージョンの JAR を追加したかどうか、およびメソッドに互換性があるかどうかを確認してください。
NoSuchMethodError : この問題の修正に数時間を費やしましたが、最終的には package name 、 clean 、および build の名前を変更するだけで修正されました...動作しない場合はまず clean build を試し、クラス名またはパッケージ名の名前を変更してから clean build を試してください..修正する必要があります。幸運を。
これらの問題は、同じ 2 つのクラスで同じオブジェクトを使用することによって発生します。使用されるオブジェクトに含まれない新しいオブジェクト クラスに含まれる新しいメソッドが追加されました。
元:
filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) )
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
at gateway.smpp.USSDClient.bind(USSDClient.java:139)
at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
at gateway.USSDGW.<init>(USSDGW.java:184)
at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)
-bash-3.00$
これらの問題は、付随する 02 同様のクラスによって引き起こされます (src に 1 つ、jar ファイルに 1 つ、ここでは gateway.jar があります)。
上記の回答は非常によく説明しています..1つ追加するだけです.Eclipseを使用している場合は、ctrl + shift + Tを使用してクラスのパッケージ構造を入力します(例:gateway.smpp.PDUEventListener)、それが存在するすべてのjar/projectsを見つけます. クラスパスから不要な jar を削除するか、クラスパスの上に追加してください。これで正しいものをピックアップします。
ファイル名が main メソッドを含むクラス名と異なる場合、このエラーが発生する可能性があります。