2013-10-02 68 views
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) 

無法理解爲什麼這種變化的發生是因爲去除靜態(類級別)的關鍵字

回答

2

在第一個例子中,當你到達行

new User("1"); 

User類加載並初始化,執行

private static String USER_ID = getUserId(); 

失敗,返回因爲在getUserId()中拋出了RuntimeException。 由ClassLoader拋出。

在第二個示例中,您只需要一個實例方法,該方法會拋出一個RuntimeException。當你最終調用該方法時,它會冒泡到JVM的未捕獲異常處理程序並終止程序。


考慮閱讀When Initialization Occurs的Java語言規範章節。