Ошибка при попытке изменить имя класса - PullRequest
1 голос
/ 16 февраля 2009
class HelloObject {
    void speak() {
        System.out.println("Hello (from object)!");
    }
}
class HelloTester {
    public static void main(String[] args) {
        HelloObject object = new HelloObject();
        object.speak();
    }
}

Когда я меняю имя класса «HelloTester» на что-то вроде «HelloTester2», программа неожиданно работает. Файл класса называется ClassesBegin.java.

Почему Java-программа не работает, когда я пытаюсь изменить имя класса?

РЕДАКТИРОВАТЬ: Извините, я должен был уточнить больше. Я изменил имя класса на HelloTestera, и это ошибка, которую я получаю: Исключение в потоке "main" java.lang.NoClassDefFoundError: HelloTester Но это работает, даже когда имя файла не имеет ничего общего с именем класса. Он работает с HelloTester, когда имя файла ClassesBegin.java

Ответы [ 5 ]

8 голосов
/ 16 февраля 2009

Вам нужно изменить имя файла, а не только имя класса.

В Java имена .java и .class должны быть идентичны именам классов.

Следовательно, каждый класс должен перейти к отдельному файлу со своим именем, чтобы был создан отдельный файл .class.

Помещение двух разных классов в один файл - это практика C ++, которая работает с моделью компиляции, а не с Java.

Редактировать: пользователь в конечном итоге выяснил, что вызвало его ошибку, поэтому, очевидно, мой ответ здесь не имеет значения. Все вышесказанное относится к публичным занятиям. Вы можете сделать это для классов уровня пакета, хотя я должен сказать, что считаю это ужасной практикой. Если вы собираетесь использовать что-то, используемое несколькими классами в вашем пакете, предоставьте ему собственный файл. Если он используется только одним классом, сделайте его внутренним классом ...

2 голосов
/ 16 февраля 2009

"РЕДАКТИРОВАТЬ: Извините, я должен был уточнить больше. Я изменил имя класса на HelloTestera, и это ошибка, которую я получаю: Исключение в потоке" main "java.lang.NoClassDefFoundError: HelloTester Но это работает, даже если имя файла имеет не имеет ничего общего с именем класса. Он работает с HelloTester, когда имя файла ClassesBegin.java "

Имя файла и имя класса должны совпадать, если класс является общедоступным.

Если вы поменяли имя класса на «HelloTestera», но запустили «java HelloTester» (что и указало бы java.lang.NoClassDefFoundError: HelloTester), то проблема заключается в том, что вы передали неверное имя класса «java».

Но сэкономьте много времени и назовите класс и файл одним и тем же и сохраните их на уровне одного класса верхнего уровня для каждого файла. Простой способ «форсировать» это сделать все ваши классы публичными (вы можете иметь только один публичный класс на файл). Это действительно избавит вас от ошибок.

1 голос
/ 16 февраля 2009

Самый простой способ сделать это:

1) только один класс верхнего уровня на файл 2) имя класса и имя файла должны совпадать (имя и CasE)

Это облегчает поиск ваших классов (имя класса - это имя файла), и вы не сталкиваетесь с некоторыми странными проблемами, когда компилятор не может найти все классы, которые можно скопировать.

У Java также есть ограничение, когда имя открытого класса 100% должно совпадать с именем файла. Ограничение только для открытых классов (или интерфейсов или перечислений). В файле может быть столько непубличных типов, сколько вы хотите ... но не делайте этого - придерживайтесь одного класса / интерфейса / перечисления верхнего уровня на файл.

1 голос
/ 16 февраля 2009

Вам разрешено иметь столько закрытых классов в вашем файле ClassesBegin, сколько вам нужно с точки зрения компиляции. Но только public (в данном случае ClassesBegin; пока вы не измените имя файла) может использоваться извне.

В частности, метод main () должен быть публичным и находиться в публичном классе, чтобы его мог найти java. Переименуйте ваш файл в HelloTester, чтобы он работал.

Или - переименуйте класс HelloTester в вашей IDE, которая, вероятно, автоматически переименовывает файл, поскольку у него есть метод main, и IDE знает, что он должен быть общедоступным классом ...

0 голосов
/ 16 февраля 2009

Вы пишете:

Я изменил имя класса на HelloTestera, и я получаю эту ошибку: Исключение в потоке "main" java.lang.NoClassDefFoundError: HelloTester

Кажется, вы на самом деле не запускаете переименованный класс, а старый. Вы вызывали Java с новым измененным именем класса? Вы перекомпилировали файл перед запуском класса?

После переименования класса вы должны сначала выполнить:

javac ClassesBegin.java

А потом:

Java HelloTestera

Что для меня дает:

Привет (с объекта)!

Обычно при использовании IDE эти проблемы решаются за вас (скомпилируйте перед запуском).

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