Java - почему этот ввод не генерирует ClassNotFoundException - PullRequest
0 голосов
/ 21 ноября 2018

Пока я использую отражение, я наткнулся на эту ошибку.У меня есть класс с именем Test1, и когда я пытаюсь получить его объект Class, введя test1 в качестве входных данных для Class.forName (), он генерирует LinkageError вместо ClassNotFoundException.Почему строчная буква сбивает с толку программу и не позволяет ей генерировать обычное исключение ClassNotFoundException, как, например, в «sjghdjgh»?

Минимальный пример

Main

public class Main {
    public static void main(String[] args) {
        try {
            Class.forName("test1");
        }
        catch (ClassNotFoundException cnfe) {
            System.out.println(cnfe.toString());
        }
        catch (LinkageError le) {
            System.out.println(le.toString());
        }
    }
}

Test1

public class Test1 {
}

1 Ответ

0 голосов
/ 21 ноября 2018

Если вы спросите у некоторых файловых систем test1.class, они вернут вам Test1.class вместо файла, который не найден (потому что они нечувствительны к регистру), а затем этот файл класса не содержит класс с именем test1, но вместо Test1 (имена классов Java чувствительны к регистру), так что загрузчик классов выдает ошибки.

На практике это редко является проблемой, поскольку большинство приложений развертываются с использованием файлов Jar (поэтомучто в файловой системе нет отдельных файлов для классов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...