«Could not find or load main class» в Java: что делать новичку?

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«Could not find or load main class»: знакомый страх каждого новичка в Java

Вы только начали изучать Java, написали свой первый HelloWorld.java, с замиранием сердца нажали Enter в терминале… И вместо заветного приветствия увидели холодное сообщение:

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld

Знакомо? Если да — вы не одиноки. Этот вопрос на Stack Overflow собрал миллионы просмотров и является абсолютным рекордсменом среди ошибок начинающих Java-разработчиков. Хорошая новость: причина почти всегда банальна, а решение занимает 30 секунд. Плохая новость: если вы не поймёте, почему это произошло, ошибка будет преследовать вас снова и снова.

В этой статье мы разберём все возможные причины появления «Could not find or load main class» на конкретных примерах. Вы научитесь не просто исправлять ошибку, а понимать, как Java ищет ваш класс. Поехали!

Коротко о главном: что пытается сказать JVM?

Когда вы пишете java ИмяКласса, виртуальная машина Java (JVM) получает команду: «Найди класс с таким именем и запусти его метод main». Если JVM не может найти файл .class с нужным именем или не находит в нём правильный метод main, она паникует и выдаёт эту ошибку.

Важно понимать: Java работает с байт-кодом (файлы .class), а не с исходниками (.java). Вы сначала компилируете .java в .class командой javac, а потом запускаете .class командой java. Если на втором шаге что-то пошло не так — вы получаете заветную ошибку.

Сценарий 1: Вы забыли скомпилировать файл

Самая частая причина, особенно у тех, кто только открыл терминал. Вы пишете:

java HelloWorld

Но перед этим не выполнили:

javac HelloWorld.java

Без компиляции файла HelloWorld.class просто не существует. JVM честно пытается его найти, но не находит и выдаёт ошибку.

Как проверить?

  • Посмотрите в текущей папке: есть ли файл HelloWorld.class?
  • Если есть только HelloWorld.java — компилируйте.
  • Если нет ни того, ни другого — проверьте, в той ли директории вы находитесь.

Сценарий 2: Опечатка в имени класса (регистр имеет значение!)

Java — язык со строгой типизацией и чувствительностью к регистру. Если ваш класс называется HelloWorld, а вы пишете:

java helloworld
java HelloWorld.class
java HelloWorld.java

— JVM вас не поймёт. Имя класса должно совпадать с именем файла с точностью до символа. Да, HelloWorld и helloworld — это разные имена для JVM.

🔥 Лайфхак: Никогда не пишите .class или .java в команде java. Только чистое имя класса!

Сценарий 3: Проблемы с package (самая коварная ловушка)

Как только вы начинаете использовать пакеты (package), правила игры меняются. Допустим, у вас есть файл:

// Файл: src/com/pythonlib/MyApp.java
package com.pythonlib;

public class MyApp {
    public static void main(String[] args) {
        System.out.println("Привет с PythonLib!");
    }
}

Многие новички делают так:

cd src
javac com/pythonlib/MyApp.java   // компиляция проходит успешно
java MyApp                        // ОШИБКА!

Почему? Потому что полное имя класса теперь — com.pythonlib.MyApp, а не просто MyApp. JVM ищет класс по полному имени, начиная с корня classpath. Правильная команда:

java com.pythonlib.MyApp

И запускать её нужно из корня пакетов (в нашем примере — из папки src).

Типичные ошибки с package:

  • Запуск не из той директории (нужно быть в корне пакетов, а не внутри папки с классом)
  • Забыли указать полное имя класса
  • Неправильная структура папок (папки должны соответствовать package)

Сценарий 4: Метод main() объявлен неправильно

Даже если JVM нашла ваш класс, она всё равно выдаст ошибку, если не найдёт в нём правильную точку входа. Метод main должен быть строго определённым:

public static void main(String[] args) { ... }

Вот неправильные варианты, которые приведут к ошибке:

// Ошибка: не public
static void main(String[] args) { }

// Ошибка: не static
public void main(String[] args) { }

// Ошибка: неправильный тип возврата
public static int main(String[] args) { return 0; }

// Ошибка: неправильный параметр (аргументы)
public static void main(String args) { }

JVM ищет именно сигнатуру public static void main(String[]). Если её нет — «Could not find or load main class».

Сценарий 5: Проблемы с classpath (CLASSPATH)

Classpath — это путь, по которому JVM ищет классы. Если вы явно не указали classpath, JVM ищет в текущей директории. Но если вы используете сторонние библиотеки или неправильно настроили переменную окружения, JVM может «забыть» про вашу папку.

Пример проблемы:

java -cp /some/other/path MyClass

Вы указали classpath, но не включили туда текущую директорию (.). Исправление:

java -cp .:/some/other/path MyClass

В Windows разделитель — точка с запятой (;), в Linux/Mac — двоеточие (:).

Сценарий 6: Файл .class повреждён или не той версии Java

Иногда вы компилируете на Java 17, а запускаете на Java 8. В этом случае JVM может не распознать байт-код. Решение: проверьте версии Java компилятора и рантайма:

javac -version
java -version

О

Блоги

Рекомендаций по книгам