Несколько классов в одном файле Java, каждый с основным методом - неожиданное поведение? - PullRequest
4 голосов
/ 23 апреля 2011

Я получил следующий код в файле с именем test.java, который находится внутри каталога C: \ D \ JavaProjects

class test
{
        public static void main( String[] str )
        {
                System.out.println( "Hello, World! from test" );
        }
}

class Test
{
        public static void main( String[] str )
        {
                System.out.println( "Hello, World!" );
        }
}

Когда я делаю "javac test.java", он выводит test.учебный класс.Теперь, если я делаю «тест java», я получаю следующий вывод:

Исключение в потоке «main» java.lang.NoClassDefFoundError: test (неправильное имя: Test) в java.lang.ClassLoader.defineClass1 (собственный метод) в java.lang.ClassLoader.defineClassCond (неизвестный источник) в java.lang.ClassLoader.defineClass (неизвестный источник) в java.security.SecureClassLoader.defineClass (неизвестный источник) в java.net.URLClassClassdefader (Неизвестный источник) в java.net.URLClassLoader.access $ 000 (Неизвестный источник) в java.net.URLClassLoader $ 1.run (Неизвестный источник) в java.security.AccessController.doPrivileged (собственный метод) в java.net.URLClassLoader.findClass (Неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) в sun.misc.Launcher $ AppClassLoader.loadClass (Неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) Не удалось найти основной класс: test.Программа закроется.

Но когда я делаю "java Test", я получаю

Hello, World!

Теперь, если я простообратное вхождение двух объявлений классов, так что Test объявляется ДО теста, компилятор java выводит файл Test.class.Теперь выполнение "теста Java" дает вывод:

Привет, мир!из теста

, но "java Test" дает

Исключение в потоке "main" java.lang.NoClassDefFoundError: Test (неправильное имя: test) в java.lang.ClassLoader.defineClass1 (собственный метод) в java.lang.ClassLoader.defineClassCond (неизвестный источник) в java.lang.ClassLoader.defineClass (неизвестный источник) в java.security.SecureClassLoader.defineClass (неизвестный источник) в javaoader.defineClass (неизвестный источник) в java.net.URLClassLoader.access $ 000 (неизвестный источник) в java.net.URLClassLoader $ 1.run (неизвестный источник) в java.security.AccessController.doPrivileged (собственный метод) в java.net.URLClassLoader.findClass (Неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) в sun.misc.Launcher $ AppClassLoader.loadClass (Неизвестный источник) в java.lang.ClassLoader.loadClass (Неизвестный источник) Не удалось найти основной класс:Тестовое задание.Программа закроется.

Теперь я знаю, что очень странно иметь два класса с главными в них в одном файле, но это поведение выглядит совершенно нелогичным и больше напоминает ошибку.Может кто-нибудь указать мне на соответствующий раздел спецификации языка Java, который определяет это поведение?Заранее большое спасибо за помощь.

Ответы [ 3 ]

9 голосов
/ 23 апреля 2011

Предположительно, вы работаете в Windows, верно?

Это означает, что у вас не может быть двух классов, отличающихся только регистром - потому что оба они в конечном итоге захотят оказаться в одном файле, так какTest.class и test.class - фактически одно и то же имя файла в нечувствительных к регистру файловых системах.

Это не совсем ошибка в Java - просто неудачное, но естественное следствие использования нечувствительной к регистру файловой системы в сочетании сязык, который придает значение именам файлов.

0 голосов
/ 30 января 2017

@ dark_secrets, имя класса нужно начинать с заглавной буквы в JAVA, иначе вы получите ошибку при компиляции.

0 голосов
/ 13 августа 2012

использовать public (затем имя класса) .... это будет определенно работать ....

...