4

序章:

SOでjava.lang.NoSuchMethodErrorを修正する方法として多くの質問があります。

ご覧のとおり、このエラーを取得する最も簡単な方法は、クラスを作成することです。

class MyClass {} // no methods at all, for instance

mainメソッドが適切に定義されていない場合は、コンパイルして実行します。

java MyClass

例外が発生します:

Exception in thread "main" java.lang.NoSuchMethodError: main

しかし、この例は単純すぎます。

質問:

誰かが簡単なコードを提供できますか?

  1. 最大2つのクラスで構成されます(さらに多くのクラスが必要であることを示すことができる場合は、大歓迎です)。
  2. 適切に定義されたmainメソッドが含まれています;
  3. そのメインメソッドでクラスを実行すると、java.lang.NoSuchMethodErrorで例外が発生します。
4

2 に答える 2

13

NoSuchMethodErrorあるクラスが別のクラスのメソッドを期待している(そしてそのメソッドが適切にコンパイルされている)が、実行時に他のクラスがそのメソッドを持たない場合に発生します。したがって、次のことを行う必要があります。

  • 2つのクラスを作成し、一方が他方のメソッドを呼び出します
  • 2つのクラスをコンパイルします
  • 次に、呼び出されたメソッドを2番目のクラスから削除し、2番目のクラスのみをコンパイルします。

次に、(mainメソッドを使用して)最初のクラスを実行すると、2番目のクラスのメソッドを呼び出そうとしたときにそのエラーがスローされます(メソッドはもう存在しません)

ただし、この例は現実の世界ではめったに起こりません。エラーが発生した実際のケースを次に示します。

  • 別のjarに依存するサードパーティのライブラリ(jar)を使用しています。ただし、これらのjarの互換性のないバージョンがあり、最初のjarは、もう/まだ存在しない2番目のjarのクラスでメソッドを呼び出そうとします。
  • コンパイル時とランタイムのクラスパスは異なります-あるライブラリのバージョン(JDK自体でもかまいません)に対してコードをコンパイルしましたが、ランタイムには他のバージョンがあります
  • マルチモジュールプロジェクトがあります。IDEはコンパイル時にプロジェクトを「リンク」するため、変更があればすぐに確認できます。ただし、ビルドするときに、モジュールの1つ(メソッドを追加した場所)をコンパイルするのを忘れたため、実行時に古いバージョンを使用しています。
于 2011-07-23T06:47:30.937 に答える
2

java.util.Properties.load(Reader)Javaバージョンが1.6.xxxx以上のmainメソッドを呼び出すクラスからクラスファイルを作成します。

1.6.xxxx未満のJavaバージョンを使用してこのクラスを実行してみてください

理由:java.util.Properties.load(Reader)Java 6で導入されました。呼び出されていますが、このバージョンのJavaには存在しません。

これは、アップデートでデフォルトの言語ライブラリに導入されたすべてのメソッドに同様に適用されます。

于 2011-07-23T06:55:51.590 に答える