Почему мы не можем определить функцию main в статических внутренних классах?
У меня есть следующий простой код
public class Tester {
static class TesterChild {
public static void main(String args[]) {
System.out.println("Test");
}
}
}
Компилируется нормально. Но когда я запускаю его, я получаю следующую ошибку
[aniket@localhost src]$ java Tester
Error: Could not find or load main class Tester
Вопрос в том, почему мы не можем определить наш метод main в статическом внутреннем классе?
Обновление 1:
Как указано в ответах / комментариях, я изменил код на следующий
public class Tester {
public static class TesterChild {
public static void main(String args[]) {
System.out.println("Test");
}
}
}
Я скомпилировал его, и он сделал два файла классов Tester.class
а также Tester$TesterChild.class
, Но все равно я получаю ошибку
[aniket@localhost Desktop]$ java Tester$TesterChild
Error: Could not find or load main class Test
Обновление 2:
Хорошо, теперь я включил текущий каталог в classpath и выполнил все еще получая ошибку
[aniket@localhost Desktop]$ java -cp . Tester$TesterChild
Error: Main method not found in class Tester, please define the main method as:
public static void main(String[] args
3 ответа
Это можно запустить как main
но вы не используете правильный класс. Ваш основной класс не Tester
но Tester.TesterChild
,
В Eclipse он будет работать без какой-либо настройки, но из командной строки вы должны использовать java 'yourpackage.Tester$TesterChild'
синтаксис, как и другие упомянутые выше.
Вы должны обернуть название вашего класса в ''
s потому что в Linux/ Unix оболочка может думать, что $TesterChild
переменная Если вы попробуете это в приглашении, вы получите что-то вроде этого, если вы пропустите ''
s:
Ошибка: не удалось найти или загрузить тестер основного класса
Если вам нужно явно указать путь к классу, вы можете использовать -cp
или -classpath
вариант или вы можете установить его из командной строки: set CLASSPATH=/somedir
Так как вы определили main()
метод во внутреннем классе.
Запустите внутренний класс, чтобы получить main()
быть выполненным.
использовать командную строку java Tester$TesterChild
,
Обновить
Я думаю, что вы помещаете файл Java в какой-то пакет. Если затем использовать эту командную строку.
java -cp . yourPackageName.Tester$TesterChild
Например, я поместил файл в пакет с именем test
Тогда моя команда такая
java -cp . test.Tester$TesterChild
Помните, что знак доллара имеет особое значение для большинства оболочек. Т.е. если пишешьjava -cp . Tester$TesterChild
ваша оболочка может заменить $TesterChild
с содержимым переменной окружения с этим именем или молча заменить его ничем, если он не существует. Пытаться java -cp . 'Tester$TesterChild'
или же java -cp . Tester\$TesterChild