Java线程和多线程(四)——主线程中的异常
来源:互联网 发布:浙江网络作家协会 编辑:程序博客网 时间:2024/05/24 05:23
作为Java的开发者,在运行程序的时候会碰到主线程抛异常的情况。如果开发者使用Java的IDE比如Eclipse或者Intellij IDEA的话,可能是不需要直接面对这个问提的,因为IDE会处理运行类来处理这些问题。
下面将描述一些在命令行模式下运行Java程序可能会碰到的异常。
java.lang.UnsupportedClassVersionError
这个异常时因为你的Java类是由另一个其他版本的JDK编译的,但是却在这个版本的命令行下尝试执行。参考下面的例子:
package com.sapphire.util;public class ExceptionInMain { public static void main() { System.out.println(10); }}
当我通过Eclipse来创建一个工程的时候,我令其JRE的版本为JavaSE-1.7,但是在我本地终端下的Java版本是JavaSE-1.6。因为IDE的配置的原因,程序在Eclipse中运行的是没什么问题的,但是在终端运行的事后,会出现如下的问题:
ethan@ethan:~/Java7Features/bin$java com/sapphire/util/ExceptionInMainException in thread "main" java.lang.UnsupportedClassVersionError: com/sapphire/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.lang.NoClassDefFoundError
这个异常实际上有两种不同的版本。第一种是开发者提供了类的全名,需要注意的是,当在运行Java程序的时候,开发者仅仅需要提供类的名字而不需要其扩展的.class
后缀。如果提供了.class
的后缀则会有类似于如下的异常信息:
ethan@ethan:~/CODE/Java7Features/bin$java com/sapphire/util/ExceptionInMain.classException in thread "main" java.lang.NoClassDefFoundError: com/sapphire/util/ExceptionInMain/classCaused by: java.lang.ClassNotFoundException: com.sapphire.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)
另一种抛出java.lang.NoClassDefFoundError
的情况就是该类确实没有找到:
ethan@ethan:~/CODE/Java7Features/bin/com/sapphire/util$java ExceptionInMainException in thread "main" java.lang.NoClassDefFoundError: ExceptionInMain (wrong name: com/sapphire/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)
需要注意的是类ExceptionInMain
在包com.sapphire.util
之中,当Eclipse编译这个类的时候,它就会放到目录/com/sapphire/util
,所以类要是找不到就会有这个异常的信息。
java.lang.NoSuchMethodError:main
当开发者尝试运行的类中没有main
方法就会抛出这个异常。在Java 7之中,错误信息更加清晰易懂:
ethan@ethan:~/CODE/Java7Features/bin$ java com/sapphire/util/ExceptionInMainError: Main method not found in class com.sapphire.util.ExceptionInMain, please define the main method as: public static void main(String[] args)
java.lang.ArithmeticException
当主方法中抛出任何异常的时候,都会将其打印到控制台。第一行显示的是抛出异常的是main
方法,之后的部分是异常类的名字,然后在冒号之后,会打印出异常的信息。举例来说,如果我在初始化类的时候敲入代码System.out.println(10/0);
,那么就会抛出如下的异常:
Exception in thread "main" java.lang.ArithmeticException: / by zero at com.sapphire.util.ExceptionInMain.main(ExceptionInMain.java:6)
前面所描述的这些都是一些常见的主线程中的异常信息。当开发者碰到的时候,最好检查一下如下信息:
- Java程序的编译器版本和JRE运行版本是否兼容
- 运行的Java类所在的目录和package是否匹配
- classpath是否包含了所有的依赖类
- 在通过命令行执行的时候,没有使用
.class
后缀来执行java程序 - Java类主方法的语法正确
- Java线程和多线程(四)——主线程中的异常
- 【Java 多线程】Java中主线程如何捕获子线程抛出的异常
- 多线程中的确保子线程退出之后 主线程退出
- 多线程:Java 线程中的异常捕获
- java 多线程 主线程等待 子线程序列、并发结果
- java 多线程 主线程等待子线程结束
- java 多线程之主线程与子线程
- 【Java多线程编程】主线程对其他线程的控制
- Java多线程--主线程等待所有子线程执行完毕
- java多线程中子线程与主线程进行轮换
- java多线程 主线程等子线程执行完毕
- java多线程--子线程的事务影响主线程吗
- Java多线程--让主线程等待子线程执行完毕
- 多线程demo-主线程和子线程交替运行
- python 多线程中子线程和主线程相互通信
- Java线程和多线程(五)——单例类中的线程安全
- Java多线程(四)——控制线程
- Java多线程(四)——线程阻塞四种情况与守护线程
- ubuntu上安装并使用nvm管理node版本
- git常用命令
- 进制转换【思维】(巧法)
- 后缀数组
- HNOI2010 bounce 弹飞绵羊 (BZOJ2002)
- Java线程和多线程(四)——主线程中的异常
- RSA加密算法的简单案例
- 使用Android系统调用裁剪图片并保存
- ESP8266 GPIO中断学习
- 几个重要的java数据库访问类和接口
- chmod 777 修改权限
- [精]Oracle EBS 12.1.3 克隆教程(Rapid Cloning)
- 关于DS报错:Delimiter for field "TURNOVER_VOLUE" not found; input: {1 8 3 5 1 9 6 8 6 6}, at offset: 65的问
- 树结构练习——排序二叉树的中序遍历