[Java] NoClassFoundException和NoClassDefFoundError

  最近出去面試的時候被問到這二者的區別, 當時就懵逼了,修習還不夠,回巢慢慢進修吧。 面試

   直奔正文吧. 數據庫

    首先 最最基本的區別在於,NoClassFoundException是一個 非受檢異常,它是一個 RuntimeException.  NoClassDefFoundError是一個錯誤。 編程

    其次 所形成的緣由也不一樣:
框架

    形成 NoClassFoundException主要是在程序運行過程當中,動態去加載類的時候,在ClassPath中找不到該類,因而就拋出NoClassFoundException,最多見的例子好比說,在使用JDBC編程的過程當中使用Class.forName("Driver Name Here")的時候,若是並無在classpath中添加相應的數據庫驅動包,則會拋出NoClassFoundException異常,除此以外還有ClassLoader.loadClass和ClassLOader.findSystemClass在加載類時也可能拋出NoClassFoundException的異常。須要注意的是,還有一種會致使NoClassFoundException的緣由是當一個類已經某個類加載器加載到內存中了,此時另外一個類加載器又嘗試着動態地從同一個包中加載這個類。在不少搭建框架的時候,出現包衝突的時候就會有此類問題,ClassPath裏面會有同名的類。
maven

    NoClassFoundException 在編譯過程當中, 編譯器是不會發現此類錯誤的,每每是在程序運行時,加載器拋出的異常。 spa

    形成NoClassDefFoundError的緣由也比較晦澀, 當JVM或者類加載器 在加載類的時候找不到類定義。字面意思看上去有點難以理解, 好比說,當 程序 去 new 一個對象或者要import 類的時候 找不到該類,看似好像和NoClassFoundException差很少嘛,其實此類錯誤主要是,程序在編譯過程當中是經過編譯,而且是有這個類的,到了運行環境的時候又沒有這個類了,多是把jar包刪除了. 常常是在 maven 作構建的時候容易形成這種錯誤哦。
對象

相關文章
相關標籤/搜索