標籤:

3種常見的Class級別的錯誤

3種常見的Class級別的錯誤

來自專欄 Java學習中的簡單記錄

ClassNotFoundException

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

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

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

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

java.lang.ClassNotFoundException: com.ethan.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 com.ehtan.utils.MyTest;public class Test extennds MyTest{ public static void main(String[] args) { Test test = new Test(); }}

Test類繼承了MyTest類,當MyTest類不存在,運行時找不到MyTest類就會報NoClassDefFoundError異常。先報出ClassNotFoundException,然後引發NoClassDefFoundError。所以,以上兩個錯誤都要確保載入類或者引用類都要在classpath路徑下。

Exception in thread "main" java.lang.NoClassDefFoundError: com/ethan/MyTest 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: com.ethan.MyTest 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

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)

推薦閱讀:

海帶上的白霜不是灰塵,是異常珍貴的葯! | 千趣
氧感測器信號異常分析
直擊九大不引人注意卻暴利異常的行業
中國人口狀況異常的潛在風險
「血糖異常」的十大危害

TAG:異常 |