天天看點

常見的3種Class級别的錯誤

ClassNotFoundException

很明顯,這個錯誤是找不到類異常,即在目前classpath路徑下找不到這個類。

ClassNotFoundException繼承了Exception,是必須捕獲的異常,是以這個異常一般發生在顯示加載類的時候,如下面兩種方式顯示來加載類并要捕獲異常。

public static void main(String[] args) {
    try {
        Class.forName("com.User");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    try {
        Test.class.getClassLoader().loadClass("com.User");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}      

當無法找到對應的類時都會抛出ClassNotFoundException異常。

java.lang.ClassNotFoundException: com.User
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.test.user.Test.main(Test.java:15)      

NoClassDefFoundError

這是虛拟機隐式加載類出現的異常。

這個異常繼承了Error類,一般發生在引用的類不存在,即類、方法或者屬性引用了某個類或者接口,如果目标引用不存在就會抛出這個異常。

import org.jdom2.input.DOMBuilder;
public class MyDomBuilder extends DOMBuilder{

}      
public static void main(String[] args) {
    MyDomBuilder builder = new MyDomBuilder();
}      

MyDomBuilder繼承了DOMBuilder,如果把DOMBuilder所屬的jar包範圍設定為provided,即運作時找不到DOMBuilder類就會報錯。

Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom2/input/DOMBuilder
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.test.user.Test.main(Test.java:8)
Caused by: java.lang.ClassNotFoundException: org.jdom2.input.DOMBuilder
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 13 more      

先報出ClassNotFoundException,然後引發NoClassDefFoundError。

是以,以上兩個錯誤都要確定加載類或者引用類都要在classpath路徑下。

ClassCastException

類轉換異常,這個錯誤一般發生在一個對象強制轉換類型的時候,如将一個String強制轉換成Integer就會報這個錯。

這個異常繼承了運作時異常RuntimeException,不需要捕獲的異常。為了避免報這個錯,在轉換之間可以先用instanceof判斷下是不是該類的引用再轉換。如果是集合類型,最好指定集合裡面的泛型。

public static void main(String[] args) {
    Object str = "123";
    Integer i = (Integer)str;
}      

字元串”123”強制轉換成Integer,然後報錯。

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    at com.test.user.Test.main(Test.java:9)