主线程异常– Java
作为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类主方法语法正确