1. ホーム

[解決済み】NoClassDefFoundErrorとClassNotFoundExceptionの原因や違いは何ですか?

2022-03-24 16:10:17

質問

とはどのような違いがあるのでしょうか? NoClassDefFoundErrorClassNotFoundException ?

何が原因で投げられるのですか?どのように解決するのですか?

新しい jar ファイルを含めるために既存のコードを修正するとき、これらの throwables によく遭遇します。 私は、webstartを通じて配布されたJavaアプリのクライアント側とサーバー側の両方で、このような状況に陥ったことがあります。

私が遭遇した考えられる理由

  1. に含まれていないパッケージは build.xml クライアント側のコード
  2. 新しい jar を使用するため、ランタイムクラスパスが欠落しています。
  3. 以前のjarとバージョンが競合している

今日、私はこのような事態に遭遇したとき、物事を動かすためにトレイル・アンド・エラーのアプローチをとっています。もっと明確に理解する必要があります。

解決方法は?

Java API仕様との違いは以下の通りです。

について ClassNotFoundException :

アプリケーションが 文字列を通してクラスを読み込む という名前を使っています。

  • forName クラス内のメソッド Class .
  • findSystemClass クラス内のメソッド ClassLoader .
  • loadClass クラス内のメソッド ClassLoader .

を持つクラスの定義はありません。 指定された名前は見つかりませんでした。

について NoClassDefFoundError :

Java仮想マシンまたは a ClassLoader インスタンスをロードしようとします。 クラスの定義で 通常のメソッド呼び出し、または を使用して新しいインスタンスを作成します。 式) の定義がなく クラスが見つかりませんでした。

検索されたクラス定義 は、現在実行中の クラスがコンパイルされましたが、その定義が が見つからなくなりました。

ということで、どうやら NoClassDefFoundError は、ソースのコンパイルが成功したときに発生しますが、実行時には、必要な class ファイルが見つかりませんでした。これは、JARファイルの配布や生産で起こりうることで、すべての必要な class が含まれています。

については ClassNotFoundException この問題は、実行時にクラスへの反射的な呼び出しを行おうとして、プログラムが呼び出そうとしたクラスが存在しないことに起因しているように思われます。

この2つの違いは、一方が Error であり、もう一方は Exception . とは NoClassDefFoundErrorError これは、Java仮想マシンが期待したクラスを見つけるのに問題があるために発生します。コンパイル時に動作すると期待されたプログラムは、以下の理由で実行できません。 class ファイルが見つからないか、コンパイル時に生成または遭遇したものと同じでない場合です。これは、JVMによってプログラムを開始することができないので、かなり重大なエラーです。

一方 ClassNotFoundExceptionException というのは、ある程度予想されることであり、回復可能なことなのです。リフレクションを使うと、エラーが起こりやすくなります(物事が期待通りに進まないことがある程度予想されるからです。必要なクラスがすべて存在することを確認するためのコンパイル時のチェックがないので、必要なクラスを見つけることに関する問題は、実行時に現れます。