查看原文
其他

3种常见的Class级别的错误

2017-09-07 javastack Java技术栈


ClassNotFoundException

很明显,这个错误是 找不到类异常,即在当前classpath路径下找不到这个类。

ClassNotFoundException继承了Exception,是必须捕获的异常,所以这个异常一般发生在显示加载类的时候,如下面两种方式显示来加载类并要捕获异常。

  1. public static void main(String[] args) {

  2.    try {

  3.        Class.forName("com.User");

  4.    } catch (ClassNotFoundException e) {

  5.        e.printStackTrace();

  6.    }

  7.    try {

  8.        Test.class.getClassLoader().loadClass("com.User");

  9.    } catch (ClassNotFoundException e) {

  10.        e.printStackTrace();

  11.    }

  12. }

当无法找到对应的类时都会抛出ClassNotFoundException异常。

  1. java.lang.ClassNotFoundException: com.User

  2.    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

  3.    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

  4.    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

  5.    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

  6.    at com.test.user.Test.main(Test.java:15)

NoClassDefFoundError

这是虚拟机隐式加载类出现的异常。

这个异常继承了Error类,一般发生在引用的类不存在,即类、方法或者属性引用了某个类或者接口,如果目标引用不存在就会抛出这个异常。

  1. import org.jdom2.input.DOMBuilder;

  2. public class MyDomBuilder extends DOMBuilder{

  3. }

  1. public static void main(String[] args) {

  2.    MyDomBuilder builder = new MyDomBuilder();

  3. }

MyDomBuilder继承了DOMBuilder,如果把DOMBuilder所属的jar包范围设置为provided,即运行时找不到DOMBuilder类就会报错。

  1. Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom2/input/DOMBuilder

  2.    at java.lang.ClassLoader.defineClass1(Native Method)

  3.    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)

  4.    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

  5.    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)

  6.    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)

  7.    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)

  8.    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)

  9.    at java.security.AccessController.doPrivileged(Native Method)

  10.    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)

  11.    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

  12.    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

  13.    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

  14.    at com.test.user.Test.main(Test.java:8)

  15. Caused by: java.lang.ClassNotFoundException: org.jdom2.input.DOMBuilder

  16.    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

  17.    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

  18.    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

  19.    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

  20.    ... 13 more

先报出ClassNotFoundException,然后引发NoClassDefFoundError。

所以,以上两个错误都要确保加载类或者引用类都要在classpath路径下。

ClassCastException

类转换异常,这个错误一般发生在一个对象强制转换类型的时候,如将一个String强制转换成Integer就会报这个错。

这个异常继承了运行时异常RuntimeException,不需要捕获的异常。为了避免报这个错,在转换之间可以先用instanceof判断下是不是该类的引用再转换。如果是集合类型,最好指定集合里面的泛型。

  1. public static void main(String[] args) {

  2.    Object str = "123";

  3.    Integer i = (Integer)str;

  4. }

字符串"123"强制转换成Integer,然后报错。

  1. Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

  2.    at com.test.user.Test.main(Test.java:9)


看完有没有收获?

分享到朋友圈给更多的人吧。




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存