主线程异常– Java

时间:2020-02-23 14:36:31  来源:igfitidea点击:

作为Java程序员,您有时必须在运行Java程序时看到"线程主线程中的异常"。

线程主异常

如果使用诸如Eclipse或者Netbeans之类的Java IDE来运行Java程序,则可能不会遇到这些问题,因为IDE会使用正确的语法和正确的命令来运行类。

其中我正在解释线程主要异常中的一些常见Java异常,您将从终端运行Java程序时会看到这些异常。

1.线程主java.lang.UnsupportedClassVersionError中的异常

当您的Java类是从另一个JDK版本编译而您正试图从另一个Java版本运行它时,就会出现此异常。
让我们用一个简单的例子来理解这一点。

package com.theitroad.util;

public class ExceptionInMain {

	public static void main() {
		System.out.println(10);
	}

}

当我在Eclipse中创建项目时,我将JRE版本保留为Java 7,但在终端Java版本中则保留为Java 1.6。
由于具有Eclipse IDE JDK设置,因此生成的类文件是使用Java 1.7编译的。
现在,当我尝试从终端运行此类时,我收到以下异常消息。

pankaj@Pankaj:~/Java7Features/bin$java com/theitroad/util/ExceptionInMain
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/theitroad/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  (URLClassLoader.java:58)
	at java.net.URLClassLoader.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.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)

当找不到Class时,抛出第二种异常。

pankaj@Pankajs-MacBook-Pro:~/CODE/Java7Features/bin/com/theitroad/util$java ExceptionInMain
Exception in thread "main" java.lang.NoClassDefFoundError: ExceptionInMain (wrong name: com/theitroad/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.access0(URLClassLoader.java:71)
	at java.net.URLClassLoader.run(URLClassLoader.java:361)
	at java.net.URLClassLoader.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)

请注意,ExceptionInMain类位于com.theitroad.util包中,因此,当Eclipse编译该类时,它位于<Project_Classes_Directory>/com/theitroad/util中,因此未找到导致此错误消息的类。

3.线程main java.lang.NoSuchMethodError中的异常:main

当您尝试运行不具有" main"方法的类时,就会出现此异常。
在Java 7中,更改了错误消息以使其更加清晰。

pankaj@Pankaj:~/CODE/Java7Features/bin$java com/theitroad/util/ExceptionInMain
Error: Main method not found in class com.theitroad.util.ExceptionInMain, please define the main method as:
 public static void main(String[] args)

4.线程" main"中的异常java.lang.ArithmeticException

每当从main方法引发异常时,它都会在控制台中打印异常。
第一部分解释了从main方法引发异常的情况,第二部分显示了异常类的名称,然后在冒号后面打印了异常消息。

例如,如果我将初始类print语句更改为System.out.println(10/0);,它将抛出ArithmeticException。

Exception in thread "main" java.lang.ArithmeticException:/by zero
	at com.theitroad.util.ExceptionInMain.main(ExceptionInMain.java:6)

如何修复线程主中的Java异常?

上面是线程main中的一些常见Java异常,每当您遇到以下任何一项检查时,便会发生以下情况:

  • 使用相同的JRE版本来编译和运行Java程序

  • 您正在从classes目录运行Java类,并且软件包作为目录提供。

  • 您的Java类路径已正确设置为包括所有依赖项类

  • 您在运行Java程序时仅使用不带.class扩展名的文件名

  • Java类主方法语法正确