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类主方法的语法正确
  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461538.html
Copyright © 2011-2022 走看看