通常NoClassDefFoundError產(chǎn)生的原因都是由于用到的class在CLASSPATH中找不到。
還有下面一種另類的NoClassDefFoundError:
1. Class A 調(diào)用 Class B
2. JVM嘗試加載Class B,并執(zhí)行Class B的靜態(tài)塊
3. Class B的靜態(tài)塊內(nèi)拋出RuntimeException,從而導(dǎo)致JVM加載Class B失敗
4. 之后,任何類只要調(diào)用Class B,就會(huì)出現(xiàn)NoClassDefFoundError
大家可以運(yùn)行下面的例子試一下:
還有下面一種另類的NoClassDefFoundError:
1. Class A 調(diào)用 Class B
2. JVM嘗試加載Class B,并執(zhí)行Class B的靜態(tài)塊
3. Class B的靜態(tài)塊內(nèi)拋出RuntimeException,從而導(dǎo)致JVM加載Class B失敗
4. 之后,任何類只要調(diào)用Class B,就會(huì)出現(xiàn)NoClassDefFoundError
大家可以運(yùn)行下面的例子試一下:
1 public class B
2 {
3 static {
4 String s = null;
5 s.substring(0);
6 }
7 }
2 {
3 static {
4 String s = null;
5 s.substring(0);
6 }
7 }
1 public class A
2 {
3 public static void main(String[] args)
4 {
5 try
6 {
7 B b = new B();
8 }
9 catch (Throwable e)
10 {
11 e.printStackTrace();
12 }
13
14 try
15 {
16 B b = new B();
17 }
18 catch (Throwable e)
19 {
20 e.printStackTrace();
21 }
22 }
23 }
2 {
3 public static void main(String[] args)
4 {
5 try
6 {
7 B b = new B();
8 }
9 catch (Throwable e)
10 {
11 e.printStackTrace();
12 }
13
14 try
15 {
16 B b = new B();
17 }
18 catch (Throwable e)
19 {
20 e.printStackTrace();
21 }
22 }
23 }