LoginSignup
5
4

More than 5 years have passed since last update.

【Linuxでの検証】Class#forNameはファイルシステムが大文字小文字の区別をしない場合にNoClassDefFoundErrorを投げることがある

Posted at

これは何?

Class#forNameはファイルシステムが大文字小文字の区別をしない場合にNoClassDefFoundErrorを投げることがある を読んだので、Linuxだとどうなのか確認した。

環境

会社にあったLinux&Java1.7

テストコード

package test;

public class TestMain {

    public static void main(String[] args) {

        try {
            test1();
        } catch(Exception e) {
            e.printStackTrace();
        }
        try {
            test2();
        } catch(Exception e) {
            e.printStackTrace();
        }
        try {
            test3();
        } catch(Exception e) {
            e.printStackTrace();
        }
        try {
            test4();
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

    public static void test1() throws ClassNotFoundException {
        Class.forName("test.TestMain");// このクラスを呼び出す
    }

    public static void test2() throws ClassNotFoundException {
        Class.forName("java.lang.Thread");// rt.jarに入っているクラスを呼び出す
    }

    public static void test3() throws ClassNotFoundException {
        Class.forName("java.lang.thread");// rt.jarに入ってるクラスの大文字小文字の間違い
    }

    public static void test4() throws ClassNotFoundException {
        Class.forName("test.testmain");// このクラスの大文字小文字の間違い
    }
}

結果

[aaaa@bbbb /cccc/]%java test.TestMain
java.lang.ClassNotFoundException: java.lang.thread
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:190)
        at test.TestMain.test3(TestMain.java:39)
        at test.TestMain.main(TestMain.java:18)
java.lang.ClassNotFoundException: test.testmain
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:190)
        at test.TestMain.test4(TestMain.java:43)
        at test.TestMain.main(TestMain.java:23)

結論

ゆとりさんの推論通りでした。

その他

Windows&Java7でも、test4()メソッドはNoClassDefFoundErrorになったのでJavaのバージョンは関係なさそう。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4