Автор оригинала: Pankaj Kumar.
Будучи программистом Java, вы, должно быть, иногда видели исключение в главном потоке
во время выполнения программы java.
Исключение в главном потоке
Если вы используете Java IDE, такую как Eclipse или Netbeans, для запуска программы Java, вы можете не столкнуться с некоторыми из этих проблем, поскольку IDE заботится о запуске класса с правильным синтаксисом и правильной командой.
Здесь я объясняю некоторые распространенные исключения java в основных исключениях потока, которые вы увидите при запуске программы java из терминала.
1. Исключение в главном потоке java.lang.Ошибка UnsupportedClassVersionError
Это исключение возникает, когда ваш класс java компилируется из другой версии JDK, и вы пытаетесь запустить его из другой версии java. Давайте разберемся в этом на простом примере.
package com.journaldev.util; public class ExceptionInMain { public static void main() { System.out.println(10); } }
Когда я создавал проект в Eclipse, я сохранил версию JRE как Java 7
, но в моем терминале версия java – Java 1.6
. Из-за настроек JDK Eclipse IDE созданный файл класса компилируется с Java 1.7. Теперь, когда я пытаюсь запустить этот класс из терминала, я получаю следующее исключение сообщение.
pankaj@Pankaj:~/Java7Features/bin$java com/journaldev/util/ExceptionInMain Exception in thread "main" java.lang.UnsupportedClassVersionError: com/journaldev/util/ExceptionInMain : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Если я запущу класс с Java 1.7, я не получу этого исключения. Причина этого исключения в том, что мы не можем скомпилировать исходный файл java из более высокой версии, а затем запустить его в более низкой версии JRE.
2. Исключение в главном потоке java.lang.NoClassDefFoundError
Существует два варианта этого исключения. В первом случае вы указываете полное имя класса, помните, что при запуске программы Java вам просто нужно указать имя класса, а не расширение.
Обратите внимание, что .class в приведенной ниже команде для запуска программы вызывает NoClassDefFoundError
. Причина этой ошибки заключается в том, что java не может найти файл класса для выполнения.
pankaj@Pankaj:~/CODE/Java7Features/bin$java com/journaldev/util/ExceptionInMain.class Exception in thread "main" java.lang.NoClassDefFoundError: com/journaldev/util/ExceptionInMain/class Caused by: java.lang.ClassNotFoundException: com.journaldev.util.ExceptionInMain.class at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Второй тип исключения возникает, когда класс не найден.
pankaj@Pankajs-MacBook-Pro:~/CODE/Java7Features/bin/com/journaldev/util$java ExceptionInMain Exception in thread "main" java.lang.NoClassDefFoundError: ExceptionInMain (wrong name: com/journaldev/util/ExceptionInMain) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:791) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
Обратите внимание , что Исключение В основном
классе находится в пакете com.journaldev.util
, поэтому, когда Eclipse компилирует этот класс, он помещается в <каталог_проекта_классов>/com/journaldev/util
, и, следовательно, класс не найден, что вызывает это сообщение об ошибке.
3. Исключение в главном потоке java.lang.Ошибка noSuchMethod: основная
Это исключение возникает, когда вы пытаетесь запустить класс, у которого нет метода main
. В Java 7 сообщение об ошибке изменено, чтобы сделать его более понятным.
pankaj@Pankaj:~/CODE/Java7Features/bin$ java com/journaldev/util/ExceptionInMain Error: Main method not found in class com.journaldev.util.ExceptionInMain, please define the main method as: public static void main(String[] args)
Подробнее читайте на java.lang.Неучтенная ошибка
4. Исключение в потоке “основной” java.lang.Арифметическое исключение
Всякий раз, когда исключение создается из основного метода, оно выводит исключение в консоль. В первой части объясняется, что исключение создается из основного метода, во второй части выводится имя класса исключения, а затем после двоеточия выводится сообщение об исключении.
Например, если я изменю начальную инструкцию печати класса на System.out.println(10/0);
, она выдаст Арифметическое исключение
.
Exception in thread "main" java.lang.ArithmeticException: / by zero at com.journaldev.util.ExceptionInMain.main(ExceptionInMain.java:6)
Как исправить исключение java в главном потоке?
Выше приведены некоторые из распространенных исключений java в основном потоке, всякий раз, когда вы сталкиваетесь с любым из них, проверьте следующее:
- Та же версия JRE используется для компиляции и запуска программы java
- Вы запускаете класс java из каталога классов, и пакет предоставляется в качестве каталога.
- Ваш путь к классам java настроен правильно, чтобы включать все классы зависимостей
- Вы используете только имя файла без расширения .class при запуске программы java
- Синтаксис основного метода класса Java правильный
Дальнейшее чтение: Обработка исключений в Java .
Вы заметили, что во всех вышеперечисленных исключениях он упоминается как “основной поток”. Это потому, что основной метод java является первым потоком в java . Подробнее читайте в разделе многопоточность на java .