Рубрики
Без рубрики

Исключение в главном потоке – Java

Исключение в главном потоке, исключение Java в главном потоке, ошибка UnsupportedClassVersionError, java.lang.NoClassDefFoundError, java.язык.Основное исправление ошибки noSuchMethod.

Автор оригинала: 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 в основном потоке, всякий раз, когда вы сталкиваетесь с любым из них, проверьте следующее:

  1. Та же версия JRE используется для компиляции и запуска программы java
  2. Вы запускаете класс java из каталога классов, и пакет предоставляется в качестве каталога.
  3. Ваш путь к классам java настроен правильно, чтобы включать все классы зависимостей
  4. Вы используете только имя файла без расширения .class при запуске программы java
  5. Синтаксис основного метода класса Java правильный

Дальнейшее чтение: Обработка исключений в Java .

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