0
假設,如果我運行下面的代碼NoClassDefFoundError的ANS靜態VS實例級別
import java.util.ArrayList;
import java.util.List;
public class NoClassDefFoundErrorDueToStaticInitFailure {
public static void main(String args[]) {
System.out.println("Main start");
new User("1");
}
}
class User {
private static String USER_ID = getUserId();
public User(String id) {
this.USER_ID = id;
}
private static String getUserId() {
throw new RuntimeException("UserId Not found");
}
}
它給
Main start
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.NoClassDefFoundError.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:10)
Caused by: java.lang.RuntimeException: UserId Not found
at com.NoClassDefFoundError.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:22)
at com.NoClassDefFoundError.User.<clinit>(NoClassDefFoundErrorDueToStaticInitFailure.java:15)
... 1 more
但是,如果我從上面的用戶類中刪除靜態的,並使其作爲低於
class User {
private String USER_ID = getUserId();
public User(String id) {
this.USER_ID = id;
}
private String getUserId() {
throw new RuntimeException("UserId Not found");
}
}
堆棧跟蹤現在是:
Main start
Exception in thread "main" java.lang.RuntimeException: UserId Not found
at com.NoClassDefFoundError.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:22)
at com.NoClassDefFoundError.User.<init>(NoClassDefFoundErrorDueToStaticInitFailure.java:15)
at com.NoClassDefFoundError.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:10)
無法理解爲什麼這種變化的發生是因爲去除靜態(類級別)的關鍵字