JavaマスターJavaプログラムサンプル集例外のサンプル → ClassNotFoundException対策

ClassNotFoundException対策

実行時に動的にクラスをロードするときに、 クラスが見つからない場合に発生する、ClassNotFoundExceptionに対する対策です。

ClassNotFoundException例外は、指定したクラスが見つからないという例外です。 設定ファイルにてクラス名を設定したり、プログラム中で利用するクラスを実行中にロードするときに起こります。 特に、JDBCのプログラミングにおいて、Class.forNameメソッドでドライバのロードを行ったときに、 この例外が発生しがちです。

samples/exception/cls/ClassNotFoundExceptionTest.java - Eclipse SDK
package samples.exception.cls;


public class ClassNotFoundExceptionTest {
  public static void main(String[] args) {
    try {
      Class.forName("com.mysql.jdbc.Driver").newInstance();
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

このコードは、MySQLというデータベースのJDBCドライバを読み込む例です。 クラスパスを適切に設定していないと、下記のようなエラーが発生します。

コマンド プロンプト

C:\JavaMaster\bin>java -cp . samples.exception.cls.ClassNotFoundExceptionTest 
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at samples.exception.cls.ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:7)

ほかにも、この例外が発生する原因としては、 forNameメソッドに指定するクラス名の間違いなどが考えられます。

なお、この例では、MySQLのサイトから ダウンロードできる「MySQL Connector/J」というJDBCドライバに含まれるJARファイルを クラスパスに含めると、例外が発生しなくなります。 たとえば、javaコマンドでは、以下のように実行します。(JARファイルがc:ドライブ直下にある場合)

java -cp .;c:/mysql-connector-java-3.1.12-bin.jar samples.exception.cls.ClassNotFoundExceptionTest