Глиф Учебники

Could not find or load main class — что делать

Справочник · Java · 2 минуты чтения

Ошибка значит: команда java не нашла скомпилированный класс с тем именем, которое ей передали.

Текст
Error: Could not find or load main class Main
Caused by: java.lang.ClassNotFoundException: Main

Что проверить

Проверяйте причины по порядку — первая встречается чаще всех. Запускаете программу в IntelliJ IDEA — сразу раздел В IntelliJ IDEA.

  1. Имя передано с расширением

    Терминал
    $ javac Main.java
    $ java Main

    Команде java нужно имя класса, а не имя файла: java Main, а не java Main.class. На java Main.class появится как раз эта ошибка — Java ищет класс с именем Main.class.

    Сокращённый запуск одной командой — java Main.java (с Java 11): тогда расширение .java нужно, а javac не нужен.

    java Main без расширения запускает программу — причина была в этом.

    Не помогло — дальше: «Не та папка»

  2. Не та папка

    java Main ищет файл Main.class в текущей папке. Посмотрите, что в ней лежит, командой dir в Windows или ls в Linux и macOS. Если Main.class нет — перейдите в нужную папку через cd или сначала скомпилируйте программу. Если javac выдал ошибки, файл .class не создаётся вовсе: прочитайте сообщения компилятора и исправьте код.

    Main.class лежит в текущей папке, и java Main запускает программу.

    Не помогло — дальше: «Большие и маленькие буквы»

  3. Большие и маленькие буквы

    Класс Main и команда java main — это разные имена. В Windows файл найдётся (система не различает регистр в именах файлов), но Java сообщит о несовпадении: NoClassDefFoundError: Main (wrong name: main). Пишите имя класса точно так, как в коде.

    Имя в команде совпадает с именем класса буква в букву, и программа запускается.

    Не помогло — дальше: «У класса есть пакет»

  4. У класса есть пакет

    Если первая строка файла — package com.example;, полное имя класса — com.example.Main, а файл Main.class должен лежать в папке com/example. Удобнее всего компилировать в отдельную папку и запускать с указанием пути:

    Терминал
    $ javac -d out Main.java
    $ java -cp out com.example.Main

    -d out раскладывает классы по папкам пакетов внутри out, -cp out говорит java, где их искать. Запуск java Main изнутри папки com/example не сработает.

    java -cp out com.example.Main запускает программу.

    Не помогло — дальше: «Задана переменная CLASSPATH»

  5. Задана переменная CLASSPATH

    Если в системе задана переменная среды CLASSPATH (её оставляют некоторые старые программы), java ищет классы только там, а текущую папку не смотрит. Проверка в Windows — echo %CLASSPATH%, в Linux — echo $CLASSPATH. Запустите с явным путём — точка значит «текущая папка»:

    Терминал
    $ java -cp . Main

    Или удалите CLASSPATH, если он не нужен другим программам.

    java -cp . Main запускает программу — мешала переменная CLASSPATH.

В IntelliJ IDEA

Похожая ошибка: нет метода main

Если класс найден, но в нём нет правильного main, сообщение другое: Main method not found in class Main. Проверьте объявление — в курсе оно везде такое: public static void main(String[] args). Частые опечатки — Main с большой буквы, string с маленькой, пропущенное static.