我不清楚以下內容:
JVM在需要時加載類,例如延遲初始化,對吧?
現在,如果類A
確實B
類的import
哪一類B
實際上不是在文件系統(例如B.class
被刪除的或者未送達或任何原因)
便無類A
得到加載和運行如果沒有方法類B
被稱爲?
或類A
無法運行,因爲導入無法解決?
或類A
被加載並運行到某個點?如果導入語句無法解析,會發生什麼情況?
4
A
回答
7
import
語句只對編譯器很重要。在字節碼中,其他類的所有引用都是完全限定的。這就是爲什麼超級進口在運行時無關緊要的原因。
你的情況,JVM將嘗試加載所需要的加載和驗證A
所有類,所以它會嘗試加載,但依賴類懶洋洋地加載只在需要的時候。看看下面的例子:B
立即
public class A {
public static void bar() {
new B().foo();
}
public static void main(String[] args) {
//bar();
}
}
編譯A.java
和刪除B.class
。沒有調用bar()
方法,你的程序將運行得很好。但是,你取消註釋代碼段實際使用B
類,一旦你會得到討厭:
Exception in thread "main" java.lang.NoClassDefFoundError: B
at A.bar(A.java:4)
at A.main(A.java:8)
Caused by: java.lang.ClassNotFoundException: B
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 2 more
如果B
不可用,你會得到NoClassDefFound
或相似。
0
如果A.class需要缺少B.class。 A.class不能被加載。
加載類是recursion operation
。
當A.class需要B.class時,JVM在PermGen
中搜索B.class。如果B.class被加載並存儲在PermGen
中,則JVM將not reload
B.class直接從PermGen
得到,否則JVM將遞歸加載B.class。
當JVM找不到B.class時,它拋出NoClassDefFoundError
。
See more about NoClassDefFoundError in [Java Specification] :page 319。
相關問題
- 1. 如果您打破Lock()語句,會發生什麼情況?
- 2. 非虛方法解析 - 爲什麼會發生這種情況
- 3. WebStorm無法解析導入語句
- 4. 導入wavemaker語句無法解析
- 5. 如果解析雲數據服務失敗,會發生什麼情況?
- 6. 如果DTD鏈接無處可逃,會發生什麼情況?
- 7. 如果寫入文件失敗,會發生什麼情況?
- 8. 如果CImage :: Load方法失敗會發生什麼情況?
- 9. 如果我們遵循HTML中的錯誤語法,會發生什麼情況
- 10. MYSQL語法錯誤 - 爲什麼會發生這種情況?
- 11. 如果finally塊引發異常,會發生什麼情況?
- 12. 如果CFile :: Write引發異常會發生什麼情況?
- 13. 如果iOS分發證書過期會發生什麼情況?
- 14. 如果我的IExceptionPublisher引發異常,會發生什麼情況?
- 15. 如果GTK無法創建新對象,會發生什麼情況?
- 16. 爲什麼會發生這種情況?
- 17. 如果在輸入int時輸入一個單詞會發生什麼情況?
- 18. 如果未處理事件會發生什麼情況?
- 19. 如果有人拿到我的appsecret,會發生什麼情況?
- 20. 如果php.ini丟失,會發生什麼情況?
- 21. minimax:如果min不起作用會發生什麼情況
- 22. 如果NSURLCache已滿,會發生什麼情況?
- 23. 如果委託不存在,會發生什麼情況?
- 24. 如果未捕獲到異常,會發生什麼情況?
- 25. 如果我不調用transaction.close或transaction.rollback,會發生什麼情況?
- 26. 如果Web服務更改參數會發生什麼情況?
- 27. 如果ExecutorService的隊列已滿,會發生什麼情況
- 28. 如果MySQL數據庫未關閉,會發生什麼情況?
- 29. 如果minSdkVersion低於targetSdkVersion,會發生什麼情況?
- 30. 如果超時,會發生什麼情況?
所以這會發生試圖解決'進口'?對。正在構建「A」類? – Jim
@Jim:不,JVM不**解析任何導入,導入在編譯期間被讀取和丟棄。它們不存在於字節碼中。在'.class'文件中,所有的類都是完全合格的。 –
+1我喜歡它什麼時候詳盡,詳細地解釋爲什麼「問題X」不會成爲問題,他們會回來;所以它是一個真正的問題。大聲笑。 –