209

NoSuchMethodErrorJava プログラムを実行するとエラーが発生します。何が問題で、どうすれば修正できますか?

4

32 に答える 32

257

これ以上の情報がなければ、問題を特定することは困難ですが、根本的な原因は、実行時に使用しているものとは異なる、メソッドが欠落しているクラスの別のバージョンに対してクラスをコンパイルした可能性が高いことです。

スタック トレースを見てください... ライブラリ内のオブジェクトでメソッドを呼び出すときに例外が発生する場合は、コンパイルおよび実行時に別のバージョンのライブラリを使用している可能性があります。両方の場所で正しいバージョンを使用していることを確認してください。

作成したクラスによってインスタンス化されたオブジェクトのメソッドを呼び出すときに例外が発生する場合はビルド プロセスに問題があるようです。コンパイル時に、実際に実行しているクラス ファイルが更新されていることを確認してください。

于 2008-08-29T20:14:56.353 に答える
112

私はあなたの問題を抱えていました。これが私がそれを修正した方法です。次の手順は、ライブラリを追加する有効な方法です。最初の 2 つの手順は正しく実行できましたが、「.jar」ファイルをファイル システムから Eclipse プロジェクトの「lib」フォルダに直接ドラッグするという最後の手順を実行していませんでした。さらに、以前のバージョンのライブラリをビルド パスと "lib" フォルダーの両方から削除する必要がありました。

ステップ 1 - ビルド パスに .jar を追加する

ここに画像の説明を入力

ステップ 2 - ソースと javadoc を関連付ける (オプション)

ここに画像の説明を入力

ステップ 3 - 実際に .jar ファイルを「lib」フォルダーにドラッグします (オプションではありません)。

ここに画像の説明を入力

于 2010-06-06T18:25:06.997 に答える
79

リフレクションの場合は が得られ、NoSuchMethodException非リフレクション コードの場合は が得られることに注意してくださいNoSuchMethodError。ある場所と別の場所に直面したとき、私は非常に異なる場所を見に行く傾向があります.

于 2008-08-31T03:45:40.083 に答える
59

JVM パラメータを変更する権限がある場合、詳細出力を追加すると、どの JAR ファイルからどのクラスがロードされているかを確認できます。

java -verbose:class <other args>

プログラムが実行されると、JVM は次のような標準出力情報にダンプする必要があります。

...

[ファイルから読み込まれた junit.framework.Assert:/C:/Program%20Files/junit3.8.2/junit.jar]

...

于 2008-09-03T16:41:45.903 に答える
16

Mavenまたは別のフレームワークを使用していて、このエラーがほぼランダムに発生する場合は、次のようなクリーン インストールを試してください。

clean install

これは、オブジェクトを作成し、メソッドがあることがわかっている場合に特に有効です。

于 2015-10-08T00:45:06.870 に答える
15

これは通常、Java ファイルがクラス ファイルよりも新しい場合にのみ Java ファイルをコンパイルするApache Antなどのビルド システムを使用している場合に発生します。メソッドのシグネチャが変更され、クラスが古いバージョンを使用していた場合、正しくコンパイルされない可能性があります。通常の修正は、完全な再構築を行うことです (通常は、「ant clean」の後に「ant」を実行します)。

これは、あるバージョンのライブラリに対してコンパイルしているが、別のバージョンに対して実行している場合にも発生することがあります。

于 2008-08-29T20:04:36.910 に答える
5

これは、リフレクションを使用した結果である可能性もあります。クラスをリフレクションし、メソッドを名前で抽出するコードがある場合 (例: with Class.getDeclaredMethod("someMethodName", .....))、リファクタリング中などにそのメソッド名が変更されるたびに、パラメーターをリフレクション メソッドに更新して一致させることを忘れないでください。新しいメソッド署名、またはgetDeclaredMethod呼び出しはNoSuchMethodException.

これが理由である場合、スタック トレースはリフレクション メソッドが呼び出されたポイントを示す必要があり、実際のメソッド シグネチャと一致するようにパラメーターを更新するだけで済みます。

私の経験では、プライベート メソッド/フィールドを単体テストし、TestUtilitiesクラスを使用してテスト検証のためにフィールドを抽出するときに、これが時々発生します。(通常、単体テストを考慮して設計されていないレガシー コードを使用します。)

于 2008-08-29T21:31:14.797 に答える
4

Web アプリを作成している場合は、コンテナーのグローバル ライブラリ ディレクトリとアプリ内に競合するバージョンの jar がないことを確認してください。クラスローダがどの jar を使用しているかは、必ずしもわからない場合があります。

例えば

  • トムキャット/共通/lib
  • mywebapp/WEB-INF/lib
于 2008-09-02T00:35:48.790 に答える
3

これは、それぞれのメソッドがクラスに存在しないことを意味します。

  1. jar を使用している場合は、逆コンパイルして、それぞれのバージョンの jar に適切なクラスがあるかどうかを確認します。
  2. ソースから適切なクラスをコンパイルしたかどうかを確認してください。
于 2016-11-04T09:14:55.703 に答える
3

Eclipse を再起動してアプリケーションを実行することで、このエラーを解決しました。私のケースの理由は、プロジェクトまたは Eclipse を閉じずにソース ファイルを置き換えたためかもしれません。これにより、使用していたクラスのバージョンが異なりました。

于 2017-09-08T07:21:46.570 に答える
2

元の質問に答えるために。ここのJavaドキュメントによると:

"NoSuchMethodError" アプリケーションがクラス (静的またはインスタンス) の指定されたメソッドを呼び出そうとし、そのクラスにそのメソッドの定義がなくなった場合にスローされます。

通常、このエラーはコンパイラによってキャッチされます。このエラーは、クラスの定義が非互換に変更された場合にのみ、実行時に発生する可能性があります。

  1. 実行時に発生する場合は、メソッドを含むクラスがクラスパスにあることを確認してください。
  2. 新しいバージョンの JAR を追加したかどうか、およびメソッドに互換性があるかどうかを確認してください。
于 2012-12-24T06:28:34.943 に答える
2

NoSuchMethodError : この問題の修正に数時間を費やしましたが、最終的には package name 、 clean 、および build の名前を変更するだけで修正されました...動作しない場合はまず clean build を試し、クラス名またはパッケージ名の名前を変更してから clean build を試してください..修正する必要があります。幸運を。

于 2019-02-18T07:12:52.277 に答える
2

これらの問題は、同じ 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 があります)。

于 2015-07-16T10:38:23.903 に答える
1

上記の回答は非常によく説明しています..1つ追加するだけです.Eclipseを使用している場合は、ctrl + shift + Tを使用してクラスのパッケージ構造を入力します(例:gateway.smpp.PDUEventListener)、それが存在するすべてのjar/projectsを見つけます. クラスパスから不要な jar を削除するか、クラスパスの上に追加してください。これで正しいものをピックアップします。

于 2016-11-19T19:21:06.260 に答える
-2

ファイル名が main メソッドを含むクラス名と異なる場合、このエラーが発生する可能性があります。

于 2015-01-12T06:13:52.157 に答える