作为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/ExceptionInMain
Exception 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.class
Exception in thread "main" java.lang.NoClassDefFoundError: com/sapphire/util/ExceptionInMain/class
Caused 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 ExceptionInMain
Exception 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/ExceptionInMain
Error: 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线程和多线程(四)——主线程中的异常的更多相关文章

  1. Linux 下子线程 exit code 在主线程中的使用

    Linux线程函数原型是这样的: void* thread_fun(void* arg) 它的返回值是 空类型指针,入口参数也是 空类型指针.那么线程的 exit code 也应该是 void * 类 ...

  2. Java多线程--让主线程等待所有子线程执行完毕

    数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...

  3. C#夯实基础之多线程二:主线程、前台线程与后台线程

    我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...

  4. android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法

    MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views.错误 goo ...

  5. 用Handler的post()方法来传递线程中的代码段到主线程中执行

    自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了.Handler的post()方法 ...

  6. Android中,子线程使用主线程中的组件出现问题的解决方法

    Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...

  7. Java线程与多线程教程

    本文由 ImportNew - liken 翻译自 Journaldev.   Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...

  8. Java 线程总结(十四)

    1.在异步任务进程中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java 并发包提供了一个方便的方法,使用 Completion ...

  9. httpUrlConnection连接网络的用法(用到了handle传递消息,在主线程中更新UI)

    由于httpclient在Android5.0以后已经过时,所以官方推荐使用httpUrlConnection来连接网络,现将该连接的基本方法展示,如下 注意:记得加入<uses-permiss ...

随机推荐

  1. GDI绘制图形的使用_验证码

    //创建GDI对象 Graphics g = this.CreateGraphics();// new Graphics(); //创建画笔对象 Pen pen = new Pen(Brushes.R ...

  2. informix服务端卸载后重新安装不成功

    可能原因: 1.实例未删除 2.配置文件未删除 安装成功后远程客户端连接不上问题: 1..如果自己设置的数据库实例报错,换一个数据库实例(database)试试,例如sysadmin

  3. 洛谷 P1880 石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  4. python_104_面向对象总结

    参考(都要认真看看):http://www.cnblogs.com/alex3714/articles/5188179.html http://www.cnblogs.com/alex3714/art ...

  5. _variant_t的使用

    我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作和方法: _co ...

  6. 【转】实用API大全

    有道翻译APIhttp://fanyi.youdao.com/openapi有道翻译API支持中英互译,同时获得有道翻译结果和有道词典结果(可能没有),返回格式为XML或JSON. 百度翻译APIht ...

  7. docker安装gitlab-ce

    pull and run docker pull docker.io/gitlab/gitlab-ce docker run -itd --name gitlab -p 10080:80 gitlab ...

  8. java中插入myslq的datetime类型的

    java.util.Date d = new java.util.Date(); Timestamp tt=new Timestamp(d.getTime()); ps.setTimestamp(4, ...

  9. 使用的是html5的canvas将文字转换成图片

    当前功能的运用场景是:用户需要传文件给他人,在用户选择文件之后需要显示一个文件图标和所选文件的名称. 当前代码部分是摘自网上,但是已经忘记在什么地方获取的,如有侵权联系小弟后自当删除. 注意:必须在h ...

  10. 关于cocos2dx for lua资源加载优化方案

    之前我写游戏加载都是从一个json文件写入要加载的文件名来实现加载,但是如果资源 比较多的情况下,会导致非常难管理,需要逐个写入.所以换了另外一种方式来加载文件. 首先,我是通过场景之前的切换时候,加 ...