3種常見的Class級別的錯誤

茅坤寶駿氹發表於2018-05-02

轉載自 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)


相關文章