NoClassDefFoundError
との違いは何ですかClassNotFoundException
?
投げられる原因は何ですか? どうすれば解決できますか?
既存のコードを変更して新しい jar ファイルを含めるときに、これらのスロー可能エラーによく遭遇します。Webstart を通じて配布された Java アプリのクライアント側とサーバー側の両方で、これらのエラーが発生しています。
私が遭遇した可能性のある理由:
build.xml
クライアント側のコードに含まれていないパッケージ- 使用している新しい jar のランタイム クラスパスが見つかりません
- 以前の jar とバージョンが競合しています
今日、このような問題に遭遇したとき、私は試行錯誤しながら問題を解決しようとしました。より明確な理解と理解が必要です。
ベストアンサー1
Java API仕様との違いは以下のとおりです。
アプリケーションが次の文字列を使用してクラスをロードしようとするとスローされます:
forName
クラスのメソッドClass
。findSystemClass
クラスのメソッドClassLoader
。loadClass
クラスのメソッドClassLoader
。しかし、指定された名前のクラスの定義は見つかりませんでした。
のためにNoClassDefFoundError
:
Java 仮想マシンまたは
ClassLoader
インスタンスがクラスの定義をロードしようとしたときに (通常のメソッド呼び出しの一部として、または new 式を使用して新しいインスタンスを作成する際に)、クラスの定義が見つからなかった場合にスローされます。検索対象のクラス定義は、現在実行中のクラスがコンパイルされたときに存在していましたが、その定義はもう見つかりません。
したがって、NoClassDefFoundError
ソースは正常にコンパイルされたが、実行時に必要なclass
ファイルが見つからなかった場合に発生するようです。これは、必要なファイルがすべて含まれていない JAR ファイルの配布または生成で発生する可能性がありますclass
。
についてはClassNotFoundException
、実行時にクラスへのリフレクション呼び出しを行おうとしたことから発生する可能性がありますが、プログラムが呼び出そうとしているクラスは存在しません。
2 つの違いは、一方が でError
、もう一方が である点ですException
。 は でNoClassDefFoundError
ありError
、これは Java 仮想マシンが予期したクラスを見つけられないことから発生します。コンパイル時に動作するはずだったプログラムは、class
ファイルが見つからないか、コンパイル時に生成または検出されたものと同じではないために実行できません。JVM によってプログラムを開始できないため、これはかなり重大なエラーです。
一方、 はClassNotFoundException
なのでException
、ある程度は予想通りであり、回復可能なものです。 リフレクションを使用すると、エラーが発生しやすくなります (予想どおりに進まないことが予想されるため)。 必要なクラスがすべて存在するかどうかを確認するコンパイル時のチェックは行われないため、目的のクラスを見つける際に問題が発生すると、実行時に発生します。