Java
 Computer >> コンピューター >  >> プログラミング >> Java

クラスがJavaに存在するのに、なぜClassNotFoundExceptionが発生するのですか?


クラスをロードしようとするときはいつでも、クラスローダーが指定されたパスでクラスを見つけることができない場合は ClassNotFoundException 生成されます。

これは、Javaプログラムの実行中に、 forName()を使用してクラスを明示的にロードしているときに発生する可能性があります。 Classという名前のクラスのメソッドまたはloadClass() ClassLoaderクラスのメソッド。これらの2つのクラスは、クラス名を表す文字列値を受け入れ、指定されたクラスをロードします。

これらのメソッドにクラス名を渡すときは、次のことを確認する必要があります-

  • これらのメソッドに渡すクラス名は正確である必要があります。

  • 指定されたクラス(およびパッケージ)は、現在のディレクトリにあるか、そのパスが環境変数classpathにリストされている必要があります。

Sampleという名前のクラスを作成したと仮定します ディレクトリ内D:// 以下に示すようにコンパイルされます-

package myPackage.example;
public class Sample {
   static {
      System.out.println("The class named Sample loaded successfully.........");
   }
}

コンパイル

D:\>javac -d . Sample.java

これにより、現在のディレクトリmyPackage.exampleにパッケージが作成され、 .classが生成されます。 サンプルのファイル その中のクラス。したがって、このクラスをロードするときは、同じディレクトリにクラスを配置し、絶対クラス名を Class.forName()に渡す必要があります。 または、 loadClass()

public class ClassNotFoundExample {
   public static void main(String args[]) {
      try {
         Class.forName("myPackage.exampl.Sample");
      }catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }
}

例外

上記のプログラムを実行すると、パッケージの名前のスペルが間違っているため、次の例外が発生します。

D:\>java ClassNotFoundExample
java.lang.ClassNotFoundException: myPackage.exampl.Sample
   at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
   at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.Class.forName0(Native Method)
   at java.base/java.lang.Class.forName(Unknown Source)
   at ClassNotFoundExample.main(ClassNotFoundExample.java:4)

別のディレクトリから特定のクラスにアクセスしようとしている場合は、-

のクラスパスを設定する必要があります。
  • .classファイルを含むフォルダー(ほとんどのパッケージ)。

    または、

  • クラスを含むjarファイル。

スペルの問題を修正し、ディレクトリE://

にあるJavaファイルからクラスをロードしようとしたとします。

public class ClassNotFoundExample {
   public static void main(String args[]) {
      try {
         Class.forName("myPackage.example.Sample");
      }catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }
}

例外

指定されたクラスの.classファイル(またはそれを含むjarファイル)を含むパッケージが現在のディレクトリにも環境変数classpathのパスのリストにもないため、同じ例外が発生します。

E:\>java ClassNotFoundExample
java.lang.ClassNotFoundException: myPackage.example.Sample
   at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
   at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.Class.forName0(Native Method)
   at java.base/java.lang.Class.forName(Unknown Source)
   at ClassNotFoundExample.main(ClassNotFoundExample.java:4)

現在のシナリオでは、クラスパスを、必要なクラスを保持するパッケージを含むディレクトリに設定します。つまり、「 D:// 」を実行し、上記のJavaプログラムを実行して動作させます。

E:\>javac ClassNotFoundExample.java
E:\>java ClassNotFoundExample
The class named Sample loaded successfully.........

  1. JavaでのCursorクラスの重要性は何ですか?

    カーソル オブジェクトのサブクラスです クラスであり、ポイントまたはインジケーターとして定義できます。 画面上。 カーソル ユーザーがマウスで操作するシステムからの入力を選択するために使用されます 。 カーソルで使用できるさまざまな種類のカーソル クラスはDEFAULT_CURSOR、CROSSHAIR_CURSOR、HAND_CURSOR、TEXT_CURSOR、WAIT_CURSOR Cursorクラスの重要なメソッドは、 getDefaultCursor()、getName()、getPredefinedCursor()、getSystemCustomCursor()です。 およびge

  2. レジストリへの変更がWindows10に保存されるのはいつですか?その理由は何ですか?

    Windowsレジストリに手動で変更を加えた場合、またはソフトウェアやデバイスドライバーのインストールまたはアンインストール中にWindowsレジストリに変更を加えた場合、Windows10またはWindowsServerはレジストリにすぐには変更を加えません。 レジストリへの変更はいつ保存されますか? レジストリに対するこのような更新は、すぐにはディスクにフラッシュされません。これの代わりに、新しいオペレーティングシステムが行うことは、変更されたレジストリデータが短い時間間隔で定期的にディスクにフラッシュされることです。 これで、レジストリに変更を加えた後、停電などの予期しない理由