zoukankan      html  css  js  c++  java
  • Java线程和多线程(四)——主线程中的异常

    作为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类主方法的语法正确
  • 相关阅读:
    使用bottle进行web开发(2):http request
    使用bottle进行web开发(1):hello world
    python modules
    python的class的__str__和__repr__(转)
    functools模块方法学习(1):partial
    bottle框架学习(2):变量定义等
    VisualSVN_Server安装_配置图文教程
    管理的艺术--达尔文进化论:适者生存 末位淘汰
    LINUX怎么修改IP地址
    Cent OS 命令行和窗口界面默认登录切换方法
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461538.html
Copyright © 2011-2022 走看看