Перейти к основному содержимому

Java — ошибка «Не удалось найти или загрузить основной класс»

· 4 мин. чтения

1. Обзор

Иногда, когда мы запускаем программу Java, мы можем увидеть «Не удалось найти или загрузить основной класс». Нетрудно догадаться, в чем причина: JVM не смогла найти основной класс и выдала эту ошибку. Но почему нельзя?

В этом уроке мы обсудим вероятные причины невозможности найти основной класс. Мы также увидим, как их исправить.

2. Пример программы

Начнем с программы HelloWorld :

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world..!!!");
}
}

Теперь давайте скомпилируем его:

$ javac HelloWorld.java

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

В следующих разделах мы запустим этот файл .class и попытаемся понять вероятные причины ошибки «Не удалось найти или загрузить основной класс».

3. Неверное имя класса

Чтобы запустить файл .class , сгенерированный компилятором Java, мы можем использовать эту команду:

java <.class filename>

Теперь запустим нашу программу:

$ java helloworld
Error: Could not find or load main class helloworld

И это не удалось с ошибкой «Не удалось найти или загрузить основной класс helloworld».

Как обсуждалось ранее, компилятор создаст файл .class с тем же именем, что и класс Java в программе. Так что в нашем случае основной класс будет иметь имя HelloWorld , а не helloworld .

Давайте еще раз попробуем с правильным регистром:

$ java HelloWorld
Hello world..!!!

На этот раз он прошел успешно.

3.1. Расширение файла

Чтобы скомпилировать программу Java, мы должны указать имя файла с его расширением (. java ):

$ javac HelloWorld.java

Но для запуска . class , нам нужно указать имя класса, а не имя файла. Поэтому нет необходимости предоставлять расширение .class :

$ java HelloWorld.class
Error: Could not find or load main class HelloWorld.class

Опять же, давайте запустим нашу программу, используя правильное имя класса:

$ java HelloWorld 
Hello world..!!!

4. Имена пакетов Java

В Java мы храним похожие классы вместе в том, что мы называем пакетом .

Переместим класс HelloWorld в пакет com.foreach :

package com.foreach;

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world..!!!");
}
}

Теперь скомпилируем и запустим обновленную программу HelloWorld , как раньше:

$ java HelloWorld
Error: Could not find or load main class HelloWorld

Но снова получаем ошибку «Не удалось найти или загрузить основной класс HelloWorld».

Попробуем понять, что мы здесь упустили.

Чтобы запустить класс Java, который находится в пакете, мы должны указать его полное имя. Таким образом, в нашем случае полное имя HelloWorldcom.foreach.HelloWorld .

Теперь, когда мы создали пакет com.foreach , мы фактически создали эту структуру папок:

com/foreach/HelloWorld.java

Сначала попробуем запустить нашу программу из каталога com/foreach :

$ java com.foreach.HelloWorld
Error: Could not find or load main class com.foreach.HelloWorld

Тем не менее, мы не можем запустить нашу программу.

Здесь, когда мы указали полное имя класса com.foreach.HelloWorld , Java попытался найти файл HelloWorld.class в com/foreach в каталоге, из которого мы запускали программу.

Поскольку мы уже были внутри com/foreach , Java не удалось найти и запустить программу HelloWorld .

Теперь вернемся в родительскую папку и запустим ее:

$ java com.foreach.HelloWorld
Hello world..!!!

И мы снова можем сказать «привет» миру.

5. Неверный путь к классам

Прежде чем двигаться дальше, давайте сначала разберемся, что такое путь к классам. Это набор классов, доступных для нашей работающей в данный момент JVM.

Мы используем переменную classpath, чтобы сообщить JVM, где найти файлы .class в файловой системе.

Во время запуска программы мы можем указать путь к классам, используя параметр -classpath :

java -classpath /my_programs/compiled_classes HelloWorld

Здесь Java будет искать файл HelloWorld.class в папке /my_programs/compiled_classes , имя которой мы только что придумали. По умолчанию переменная пути к классам имеет значение «.», что означает текущий каталог.

В приведенном выше разделе мы изменили наш каталог для запуска нашей программы. Но что, если мы хотим запустить его из какой-то другой папки? Вот когда нам помогает переменная classpath.

Чтобы запустить нашу программу из каталога com/foreach , мы можем просто указать, что наш путь к классам находится на два каталога выше — по одному для каждой части пакета:

$ java -claspath ../../ com.foreach.HelloWorld
Hello world..!!!

Здесь «..» представляет родительский каталог. В нашем случае «../../» представляет собой вершину нашей иерархии пакетов.

6. Заключение

В этой статье мы узнали вероятные причины ошибки «Не удалось найти или загрузить основной класс».

Потом, конечно же, мы также узнали, как решить эту ошибку.