Java - ClassNotFoundExceptionの発生原因と解決策

java.lang.ClassNotFoundExceptionエラーは、プログラムの実行中にオブジェクトを作成するときにクラスが見つからない場合に発生するExceptionです。

1. 問題の原因

クラスが見つからない理由はさまざまですが、最初に開発しているIDEのコンパイルの問題で、私が追加したクラスがJARに追加されずにプログラムが実行された可能性があります。あるいは、使用しているライブラリで別のライブラリを使用していますが、互換性の問題で(クラスが定義されていない低バージョンのライブラリを使用)クラスを見つけることができない場合があります。

2. 解決策 1

デフォルトでは、Javaプログラムが実行されると、設定されたclasspathパスでクラスを見つけます。私のプログラムが複数の外部ライブラリを使用している場合、このライブラリの場所はclasspathに一緒に追加されます。 クラスが見つからなかったことは、このクラスパスで定義されたパスのJARファイルでクラスが見つからなかったことを意味します。場合によっては、IDEでプロジェクトを作成し、そのプロジェクトから複数のモジュールに分割して開発するときに、一部のモジュールがコンパイルされないことがあります。こういうとき、Mainクラスはサブモジュールにあるクラスの存在を知っていてコンパイルになりましたが、新規クラスが追加されたサブモジュールはコンパイルされないことがあります。プログラムが実行されると、Mainクラスは以前にビルドされたサブモジュールのJARを使用できます。このときClassNotFoundExceptionが発生する可能性があります。

回避策は、ビルド出力をクリアして初期化して再構築することです。

3. 解決策 2

私が使用している外部ライブラリの互換性の問題で発生する場合です。

たとえば、メインモジュールで UserLibrary.jar という外部ライブラリを使用しています。 UserLibrary.jarmath_version_2.jarという外部ライブラリを使ってコンパイルされました。 math_version_2.jarには math_version1.jarから ConvertFloatToIntという新しいクラスが追加されました。

このとき、私のプロジェクトが UserLibrary.jarmath_version1.jarを使用している場合、互換性の問題で ConvertFloatToIntクラスを見つけることができず、 ClassNotFoundExceptionが発生する可能性があります。

回避策は、ライブラリの互換性の問題が発生しないように正しいバージョンを追加することです。通常、MavenまたはGradleでどのライブラリをロードするときに、そのライブラリが使用するライブラリをすべて追加しますが、複数のライブラリが共通に使用するライブラリがあるときにバージョンの問題が発生することがあります。またはIDEの問題で、依存ライブラリを正しくロードしていないことがあります。これはツールの問題なので、プロジェクトビルドの出力をクリアしてプログラムを再起動すると解決することができます。

私のせいではなく、ツールが間違って発生する問題であれば、長い時間を挿入することができます。うまくいけば突然ダメになりたい場合は、ビルド出力をクリアしてプログラムを再起動してみるのが良いようです。それでも問題が解決したら、そのクラスを使用するライブラリを見てみると良いと思います。

References

Related Posts

codechachaCopyright ©2019 codechacha