Nedenler ve NoClassDefFoundError ve ClassNotFoundException arasındaki farklar nelerdir?


371

Arasındaki fark nedir NoClassDefFoundErrorve ClassNotFoundException?

Onların atılmasına ne sebep olur? Nasıl çözülebilirler?

Sık sık yeni jar dosyaları içerecek şekilde mevcut kodu değiştirirken bu sarf malzemeleri ile karşılaşıyorum. Webstart üzerinden dağıtılan bir java uygulaması için hem istemci tarafında hem de sunucu tarafında onları vurdum.

Karşılaştığım olası nedenler:

  1. build.xmlkodun istemci tarafı için dahil olmayan paketler
  2. Kullandığımız yeni kavanozlar için çalışma zamanı sınıf yolu eksik
  3. sürüm önceki kavanozla çakışıyor

Bunlarla bugün karşılaştığımda, işleri halletmek için bir iz ve hata yaklaşımı kullanıyorum. Daha fazla açıklığa ve anlayışa ihtiyacım var.


Genellikle JVM'yi -verbose(örn. -verbose:class -verbose:jni) Yardımcılarıyla çalıştırmayı buluyorum - ancak mogsie, cevaplarının altında bunun yararlı bir bilgi
sağlamadığını bildiriyor

Yanıtlar:


388

Java API Spesifikasyonları'ndan fark aşağıdaki gibidir.

Şunun için ClassNotFoundException:

Bir uygulama bir sınıfı dize adı aracılığıyla yüklemeye çalıştığında atılır:

  • forNameSınıfta yöntem Class.
  • findSystemClassSınıfta yöntem ClassLoader.
  • loadClassSınıfta yöntem ClassLoader.

ancak belirtilen ada sahip sınıf için bir tanım bulunamadı.

Şunun için NoClassDefFoundError:

Java Sanal Makinesi veya ClassLoaderörneği bir sınıf tanımında (normal yöntem çağrısının bir parçası olarak veya yeni ifadeyi kullanarak yeni bir örnek oluşturmanın bir parçası olarak) yüklenmeye çalıştığında atılır ve sınıfın hiçbir tanımı bulunamadı.

Aranan sınıf tanımı, şu anda yürütülen sınıf derlendiğinde vardı, ancak tanım artık bulunamıyor.

Bu nedenle, NoClassDefFoundErrorkaynak başarıyla derlendiğinde ortaya çıkıyor, ancak çalışma zamanında gerekli classdosyalar bulunamadı. Bu, gerekli tüm classdosyaların dahil edilmediği JAR dosyalarının dağıtımında veya üretiminde olabilecek bir şey olabilir .

Gelince ClassNotFoundException, çalışma zamanında sınıflara yansıtıcı çağrı yapmaya çalışmaktan kaynaklanıyor gibi görünebilir, ancak programın çağırmaya çalıştığı sınıflar mevcut değildir.

İkisi arasındaki fark, birinin an Errordiğerinin an olmasıdır Exception. İle NoClassDefFoundErrorbir Errorve Java Sanal Makine bulmak beklenen bir sınıf bulmakta sorun yaşıyor. Derleme zamanında çalışması beklenen bir program, classdosyalar bulunamadığından veya derleme zamanında üretilen veya karşılaşılanla aynı olmadığından çalışamaz. Bu program oldukça kritik bir hatadır, çünkü program JVM tarafından başlatılamaz.

Öte yandan, bu ClassNotFoundExceptionbir Exception, bu yüzden biraz bekleniyor ve kurtarılabilir bir şey. Yansımayı kullanmak hataya açık olabilir (işlerin beklendiği gibi gitmeyebileceği konusunda bazı beklentiler olduğu için, gerekli tüm sınıfların var olduğunu görmek için derleme zamanı kontrolü yoktur, bu nedenle istenen sınıfları bulmakla ilgili herhangi bir sorun çalışma zamanında görünecektir. .


53
NoClassDefFoundErrorgenellikle sınıfın statik bloğu veya statik alanların başlatılmasıyla ilgili bir sorun olduğunda (istisna atılır), bu nedenle sınıf başarıyla başlatılamaz.
Dagang

7
upvote. biri bir Errordiğeri bir Exception. :)
Ravi

83

Bildirilen sınıf ClassLoader tarafından bulunamadığında bir ClassNotFoundException oluşturulur. Bu genellikle sınıfın CLASSPATH sınıfında eksik olduğu anlamına gelir. Ayrıca, söz konusu sınıfın, bir üst sınıf yükleyiciye yüklenen başka bir sınıftan yüklenmeye çalıştığı ve dolayısıyla alt sınıf yükleyicideki sınıfın görünmediği anlamına da gelebilir. Bu bazen bir Uygulama Sunucusu gibi daha karmaşık ortamlarda çalışırken (WebSphere bu tür yükleyici sorunları için kötüdür) söz konusudur.

İnsanlar genellikle kafa karıştırıcı olma eğilimindedir java.lang.NoClassDefFoundError, java.lang.ClassNotFoundExceptionancak önemli bir ayrım vardır. Örneğin, bir istisna (gerçekten bir hata java.lang.NoClassDefFoundErrorjava.lang.Error alt sınıfıdır) gibi

java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory

ActiveMQConnectionFactory sınıfının CLASSPATH içinde olmadığı anlamına gelmez. Infact tam tersi. ActiveMQConnectionFactory sınıfının ClassLoader tarafından bulunduğu, ancak sınıfı yüklemeye çalışırken sınıf tanımını okurken bir hatayla karşılaştığı anlamına gelir. Bu genellikle söz konusu sınıf statik bloklar veya ClassLoader tarafından bulunmayan bir Sınıf kullanan üyelere sahip olduğunda olur. Bu nedenle suçluyu bulmak için söz konusu sınıfın kaynağını (bu durumda ActiveMQConnectionFactory) görüntüleyin ve statik bloklar veya statik üyeler kullanarak kod arayın. Kaynağa erişiminiz yoksa JAD kullanarak kaynak kodunu basitçe çözmeniz yeterlidir.

Kodu incelerken, aşağıdaki gibi bir kod satırı bulduğunuzu varsayalım, CLASSPATH'nizde SomeClass sınıfının olduğundan emin olun.

private static SomeClass foo = new SomeClass();

İpucu: Bir sınıfın hangi kavanoza ait olduğunu öğrenmek için jarFinder web sitesini kullanabilirsiniz. Bu, joker karakterleri kullanarak bir sınıf adı belirtmenize olanak tanır ve sınıfı kavanoz veritabanında arar. jarhoo aynı şeyi yapmanıza izin veriyor ama artık ücretsiz.

Bir sınıfın hangi kavanoza ait olduğunu yerel bir yolda bulmak istiyorsanız, jarscan ( http://www.inetfeedback.com/jarscan/ ) gibi bir yardımcı program kullanabilirsiniz . Sadece bulmak istediğiniz sınıfı ve sınıfı kavanozlarda ve zip dosyalarında aramaya başlamak istediğiniz kök dizin yolunu belirtirsiniz.


9
Bu tam olarak doğru cevap son oy komik. (Oy vermeden önce -1 bile). ClassNotFoundException, CL'nin .class dosyasını görmediği anlamına gelir. NoClassDefFoundError, .class dosyasının yüklenemediği anlamına gelir (muhtemelen JNI hatası).
user43685

1
Bu cevap, cevap formu coobird ile çelişmiyor mu?
zardosht

Benzer statik blok örneğini denedim. Sınıfım Class1 statik değişkeni var "private static B foo = new B ();" Derlemeden sonra, bin klasöründen B.class dosyasını kaldırdım. Class1 nesnesini oluşturduğumda, üçüncü sınıfın Main yönteminden. Rüya follws olarak thown: -------- "iş parçacığı istisna" ana "java.lang.NoClassDefFoundError: bahar / B" ........ Yani tam olarak hangi sınıf bulunamadı bulunamadı dış sınıfta değil statik blokta atıf yapılan ieclass, bu cevaba aykırıdır.
Kaushik Lele

"ActiveMQConnectionFactory sınıfının CLASSPATH içinde olmadığı anlamına gelmez" ile ilgili açıklama için +1
akila

35

NoClassDefFoundErrortemel olarak bir bağlantı hatasıdır. Bir nesneyi başlatmaya çalıştığınızda oluşur (statik olarak "yeni" ile) ve derleme sırasında olduğu zaman bulunmaz.

ClassNotFoundExceptiondaha geneldir ve var olmayan bir sınıfı kullanmaya çalıştığınızda bir çalışma zamanı istisnasıdır. Örneğin, bir işlevde bir arabirim kabul eden bir parametreniz vardır ve birisi bu arabirimi uygulayan bir sınıftan geçer, ancak sınıfa erişiminiz yoktur. Ayrıca, loadClass()veya gibi dinamik sınıf yükleme durumlarını da kapsar Class.forName().


29

NoClassDefFoundError (NCDFE) kodunuz "new Y ()" çalıştırdığında ve Y sınıfını bulamadığında gerçekleşir.

Diğer yorumların önerdiği gibi Y'nin sınıf yükleyicinizde eksik olması olabilir, ancak Y sınıfının imzalı olmaması veya geçersiz bir imzası olması veya Y'nin kodunuz tarafından görülmeyen farklı bir sınıf yükleyici tarafından yüklenmesi olabilir veya Y bile yukarıdaki nedenlerden herhangi biri nedeniyle yüklenemeyen Z'ye bağlıdır.

Bu olursa, JVM, X (NCDFE) yüklemesinin sonucunu hatırlar ve nedenini söylemeden her Y istediğinde yeni bir NCDFE atar:

a sınıfı {
  statik sınıf b {}
  public static void main (Dize bağımsız değişkenleri []) {
    System.out.println ("İlk denemede yeni b ():");
    {yeni b (); } catch (Fırlatılabilir t) {t.printStackTrace ();}
    System.out.println ("\ nİkinci deneme yeni b ():");
    {yeni b (); } catch (Fırlatılabilir t) {t.printStackTrace ();}
  }
}

bunu bir yerde a.java olarak kaydet

Kod sadece iki kez yeni bir "b" sınıfı başlatmaya çalışır, bunun dışında herhangi bir hata yoktur ve hiçbir şey yapmaz.

Kodu ile derleyin javac a.java, Sonra a'yı çalıştırarak çalıştırın java -cp . a- sadece iki satır metin yazdırmalı ve hatasız çalışmalıdır.

Ardından, eksik veya bozuk sınıfı simüle etmek için "a $ b.class" dosyasını silin (veya çöple doldurun veya üzerine a.class kopyalayın). İşte olanlar:

İlk denemede yeni b ():
java.lang.NoClassDefFoundError: a $ b
    a.main (a.java:5)
Nedeni: java.lang.ClassNotFoundException: a $ b
    java.net.URLClassLoader $ 1.run'da (URLClassLoader.java:200)
    java.security.AccessController.doPrivileged (Yerel Yöntem)
    java.net.URLClassLoader.findClass adresinde (URLClassLoader.java:188)
    java.lang.ClassLoader.loadClass'ta (ClassLoader.java:307)
    sun.misc.Launcher'da $ AppClassLoader.loadClass (Launcher.java:301)
    java.lang.ClassLoader.loadClass'ta (ClassLoader.java:252)
    java.lang.ClassLoader.loadClassInternal'da (ClassLoader.java:320)
    ... 1 tane daha

İkinci denemede yeni b ():
java.lang.NoClassDefFoundError: a $ b
    a.main (a.java:7)

İlk çağırma, söz konusu kodun ( new b()) çalışması gerektiğinden , denetlenmeyen bir NoClassDefFoundError içine sarılması gereken bir ClassNotFoundException özelliğiyle (sınıfı yükleyemediğinde sınıf yükleyicisi tarafından atılır) sonuçlanır .

İkinci deneme de elbette başarısız olacaktır, ancak gördüğünüz gibi sarılmış istisna artık yoktur, çünkü ClassLoader başarısız sınıf yükleyicileri hatırlıyor gibi görünüyor. Sadece NCDFE'yi gerçekten ne olduğuna dair hiçbir ipucu olmadan görüyorsunuz.

Bu nedenle, kök nedeni olmayan bir NCDFE görürseniz, hatanın nedenini bulmak için sınıfın ilk kez yüklendiğini izleyip izleyemeyeceğinizi görmeniz gerekir.


JVM'yi -verbosebelirli JVM'ye bağlı olarak veya benzer bir seçenekle çalıştırmaya ne dersiniz ? Muhtemelen -verbose:class, belki -verbose:class:jniJNI kullanıyorsanız, ancak sözdiziminden emin değilim. Bu faydalıysa, belki sonuçları gösterebilirsiniz.
PJTraill

Ne -verbose:classde -verbose:jnieksik sınıfa alakalı herhangi bir ek çıktı verir.
mogsie

1
Sonuç hayal kırıklığı yaratıyor olsa bile denediğiniz için teşekkür ederiz. (PS O zamandan beri öğrendim ki -verbose:class:jniyanlıştır: Bir iki ayrı seçenek belirtmek zorundadır: -verbose:class -verbose:jni.)
PJTraill

2
Son cümle * 1.000.000: Bu nedenle, kök nedeni olmayan bir NCDFE görürseniz, hatanın nedenini bulmak için sınıfın ilk kez yüklendiğini izleyip izleyemeyeceğinizi görmeniz gerekir.
batwad

20

Gönderen http://www.javaroots.com/2013/02/classnotfoundexception-vs.html :

ClassNotFoundException: sınıf yükleyicisi gerekli sınıfı sınıf yolunda bulamadığında oluşur. Yani, temel olarak sınıf yolunuzu kontrol etmeli ve sınıfı sınıfyoluna eklemelisiniz.

NoClassDefFoundError: hata ayıklamak ve sebebini bulmak daha zordur. Bu, derleme zamanında gerekli sınıflar bulunduğunda atılır, ancak çalışma zamanında sınıflar değiştirilir veya kaldırılır veya sınıfın statik başlatmaları istisnalar atar. Bu, yüklenen sınıfın sınıfyolunda mevcut olduğu, ancak bu sınıfın gerektirdiği sınıflardan birinin derleyici tarafından kaldırıldığı veya yüklenemediği anlamına gelir. Yani bu sınıfa bağlı olan sınıfları görmelisiniz.

Örnek :

public class Test1
{
}


public class Test 
{
   public static void main(String[] args)
   {
        Test1 = new Test1();    
   }

}

Şimdi her iki sınıfı da derledikten sonra Test1.class dosyasını silip Test sınıfını çalıştırırsanız,

Exception in thread "main" java.lang.NoClassDefFoundError: Test
    at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

ClassNotFoundException: bir uygulama adı aracılığıyla bir sınıfa yüklemeye çalıştığında atılır, ancak belirtilen ada sahip sınıf için bir tanım bulunamadı.

NoClassDefFoundError: Java Sanal Makinesi bir sınıf tanımında yüklenmeye çalışırsa ve sınıfın hiçbir tanımı bulunamazsa atılır.


JVM'yi -verbosebelirli JVM'ye bağlı olarak veya benzer bir seçenekle çalıştırmaya ne dersiniz ? Muhtemelen -verbose:class, belki -verbose:class:jniJNI kullanıyorsanız, ancak sözdiziminden emin değilim.
P

-verbose:class:jniyanlış, ama iki ayrı seçenek geçirebilirsiniz: -verbose:class -verbose:jni.
PJTraill

15

Her birini almanın nedeni ve bu tür hatalarla nasıl başa çıkılacağı konusunda herhangi bir düşünce süreci nedir?

Onlar yakından ilişkilidir. ClassNotFoundExceptionJava belirli bir sınıfı adıyla aramaya başladığında ve başarıyla yüklenemediğinde A atılır. Bir NoClassDefFoundErrorJava bazı mevcut koduna bağlantılı olduğunu bir sınıf arayan gittiğinde atılır, ama bir nedenle veya başka (örneğin, yanlış sınıf yolu, Java, bir kütüphanenin yanlış versiyonunun yanlış sürüm) bulamadım ve iyice ölümcüldür çünkü bir şeylerin çok yanlış gittiğini gösterir.

Eğer bir C arka plan var, bir CNFE bir başarısızlık gibi dlopen()/ dlsym()ve bir NCDFE bağlayıcı bir sorundur; ikinci durumda, ilgili sınıf dosyaları bunları kullanmaya çalıştığınız yapılandırmada asla derlenmemiş olmalıdır.


11

Örnek 1:

class A{
 void met(){
   Class.forName("com.example.Class1");
 }
}

Eğer com/example/Class1Sınıf yollarıyla hiçbirinde yok, o zaman bu atar ClassNotFoundException.

Örnek 2 -

Class B{
  void met(){
   com.example.Class2 c = new com.example.Class2();
 }
}

Eğer com/example/Class2B derleme sırasında vardı ancak yürütme sırasında bulunamadı, sonra O atar NoClassDefFoundError.

Her ikisi de çalışma zamanı istisnalarıdır.


9

Sınıfı bir String aracılığıyla referans alarak yükleme girişimi olduğunda ClassNotFoundException oluşturulur . Örneğin, Class.forName () parametresi bir String'dir ve bu, sınıf yükleyiciye geçersiz ikili adların geçirilme olasılığını artırır.

ClassNotFoundException, geçersiz olabilecek bir ikili adla karşılaşıldığında atılır; örneğin, sınıf adı '/' karakterine sahipse, bir ClassNotFoundException almanız gerekir. Ayrıca, doğrudan başvurulan sınıf sınıf yolunda olmadığında da atılır.

Öte yandan, NoClassDefFoundError atıldı

  • sınıfın gerçek fiziksel temsili - .class dosyası kullanılamıyorsa,
  • veya sınıf zaten farklı bir sınıf yükleyiciye yüklenmişse (genellikle bir üst sınıf yükleyici sınıfı yükler ve bu nedenle sınıf tekrar yüklenemez),
  • veya uyumsuz bir sınıf tanımı bulunursa - sınıf dosyasındaki ad istenen adla eşleşmiyorsa,
  • veya (en önemlisi) bağımlı bir sınıf bulunamaz ve yüklenemezse. Bu durumda, doğrudan başvurulan sınıf bulunmuş ve yüklenmiş olabilir, ancak bağımlı sınıf kullanılamıyor veya yüklenemiyor. Bu, doğrudan başvurulan sınıfın bir Class.forName veya eşdeğer yöntemlerle yüklenebileceği bir senaryodur. Bu bağlantıda bir arıza olduğunu gösterir.

Kısacası, sınıf yükleyici sınıf tanımını bulamadığında ( s).

Sonunda, bir sınıfı yükleyemediğinde bir ClassNotFoundException örneğini atmak ClassLoader uygulamasına kalmıştır. Çoğu özel sınıf yükleyici uygulaması URLClassLoader'ı genişlettiklerinden bunu gerçekleştirir. Genellikle sınıf yükleyiciler yöntem uygulamalarının hiçbirine açıkça bir NoClassDefFoundError atmaz - bu istisna genellikle sınıf yükleyicinin kendisi tarafından değil, HotSpot derleyicisindeki JVM'den atılır.


'Sınıf dosyasındaki adın istenen adla eşleşmediğini' belirtmek için yukarı oy verin. Bu oldukça yaygın bir nedendir.
Lorne Marquis

8

ClassNotFoundException Vs NoClassDefFoundError Arasındaki Fark

resim açıklamasını buraya girin


Kristal berraklığında değil. "Sınıf yolunda güncellenmemiş" belirsiz / kesin değil. Bu ikisinden biri hakkında JAR değil varlık olan mevcut sınıf yolunda veya yanlış sürüm üzerinde sınıf olma JAR. Ve yazım hataları. Ve (iç çek) bilgilerinizi funky bir grafik olarak gönderdiğiniz için bunu düzeltemiyoruz.
Stephen C

8

İsimlerin kendisi ile birini Exceptionve diğerini de kolayca tanımlayabiliriz Error.

İstisna: İstisnalar, programın yürütülmesi sırasında meydana gelir. Bir programcı catch bloğunu deneyerek bu istisnayı kaldırabilir. İki tür istisnamız var. Derleme zamanında atılan kontrol edilmiş istisna. Çalışma zamanında atılan Çalışma Zamanı İstisnaları, bu istisna genellikle kötü programlama nedeniyle olur.

Hata: Bunlar istisna değildir, programcının kapsamı dışındadır. Bu hatalar genellikle JVM tarafından atılır.


resim açıklamasını buraya girin görüntü kaynağı

Fark:

ClassNotFoundException:

  • Sınıf yükleyici başarısız doğrulamak biz söz bir sınıf bayt kodu Bağlantı faz arasında sınıf yükleme alt sistem elde ederiz ClassNotFoundException.
  • ClassNotFoundExceptiondoğrudan java.lang.Exceptionsınıftan türetilmiş, işaretlenmiş bir İstisna'dır ve bunun için açıkça işlem yapmanız gerekir
  • ClassNotFoundExceptionClassLoader.loadClass (), Class.forName () ve ClassLoader.findSystemClass () kullanılarak çalışma zamanında sınıf adı sağlanarak sınıfın açık bir yüklemesi söz konusu olduğunda ortaya çıkar .

NoClassDefFoundError:

  • Sınıf yükleyici başarısız çözümünde bir sınıfın referanslarını Bağlantı fazının ait sınıf yükleme alt sistem elde ederiz NoClassDefFoundError.
  • NoClassDefFoundErrorLinkageErrorbir sınıfın başka bir sınıfa bağımlı olduğu ve derlemeden sonra sınıfın uyumsuz bir şekilde değiştiği hata durumlarını belirtmek için kullanılan sınıftan türetilen bir Hata'dır.
  • NoClassDefFoundErrorsöz konusu sınıftan bir yöntem çağrısı veya herhangi bir değişken erişim nedeniyle sınıfın örtülü olarak yüklenmesinin sonucudur .

benzerlikler:

  • Her ikisi de NoClassDefFoundErrorve ClassNotFoundExceptionbir sınıfın çalışma zamanında kullanılamamasıyla ilgilidir.
  • Her ikisi de ClassNotFoundExceptionve NoClassDefFoundErrorJava sınıfyoluyla ilişkilidir.

3

Sınıf yükleyici sussystem eylemleri göz önüne alındığında:

http://www.artima.com/insidejvm/ed2/images/fig7-1.gif

Bu farkı anlamama yardımcı olan bir makale: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

Sınıf yüklemesi sırasında bir hata oluşursa , programda (doğrudan veya dolaylı olarak) yüklenen sınıfı veya arabirimi kullanan bir noktaya LinkageError alt sınıfının bir örneği atılmalıdır.

Java Sanal Makinesi, doğrulama (§5.4.1) veya çözünürlük (§5.4.3) (ancak başlatma (§5.5)) sırasında bir C sınıfı yüklemeye çalışırsa ve C'nin yüklenmesini başlatmak için kullanılan sınıf yükleyici ClassNotFoundException örneğini atarsa , Java Sanal Makinesi'nin nedeni ClassNotFoundException örneği olan NoClassDefFoundError örneğini atmalıdır .

Bir ClassNotFoundException , NoClassDefFoundError öğesinin temel nedenidir .
Ve NoClassDefFoundError , Bağlama adımında ortaya çıkan özel bir tür yükleme hatası örneğidir .


2

Uygulamada olası bir nedeni ekleyin:

  • ClassNotFoundException: cletus'un dediği gibi, miras alınan arabirim sınıfı sınıfyolunda değilken arabirimi kullanırsınız. Örneğin, Servis Sağlayıcı Modeli (veya Servis Bulucu ) mevcut olmayan bazı sınıfları bulmaya çalışır
  • NoClassDefFoundError: verilen sınıf, belirli bir sınıfın bağımlılığı bulunmazken bulunur

Uygulamada Hata sessizce atılabilir , örneğin bir zamanlayıcı görevi gönderirsiniz ve zamanlayıcı görevinde Hata atar , ancak çoğu durumda programınız yalnızca İstisna yakalar . Daha sonra Timer ana döngüsü herhangi bir bilgi olmadan sonlandırılır. NoClassDefFoundError öğesine benzer bir Hata, ExceptionInInitializerError'dır ; statik başlatıcı veya statik değişken için başlatıcı bir istisna fırlattığında.


1

ClassNotFoundException , JVM'ye Class.forName () veya ClassLoader.findSystemClass () veya ClassLoader.loadClass () yöntemlerini kullanarak bir sınıfı dize adıyla yüklemesini söylediğimizde ve belirtilen sınıf sınıf yolunda bulunmadığında oluşan denetimli bir istisnadır.

Çoğu zaman, bu istisna, sınıf yolunu gerekli JAR dosyalarıyla güncelleştirmeden bir uygulamayı çalıştırmaya çalıştığınızda oluşur. Örneğin, veritabanınıza ieMySQL bağlanmak için JDBC kodunu yaparken bu istisnayı görmüş olabilirsiniz, ancak sınıf yolunuzda JAR yoktur.

NoClassDefFoundError hatası, JVM kod yürütmenizin parçası olan (normal yöntem çağrısının bir parçası olarak veya yeni anahtar sözcüğü kullanarak bir örnek oluşturmanın bir parçası olarak) belirli bir sınıfı yüklemeye çalıştığında ve bu sınıf sınıf yolunuzda bulunmadığında oluşur. Derleme zamanında mevcut çünkü programınızı yürütmek için onu derlemeniz gerekiyor ve eğer var olmayan bir sınıfı kullanmaya çalışıyorsanız derleyici derleme hatası verecektir.

Aşağıda kısa açıklama

resim açıklamasını buraya girin

Daha fazla bilgi için ClassNotFoundException VC NoClassDefFoundError Hakkında Her Şey'i okuyabilirsiniz .


0

Yenilemem gerektiğinde kendime aşağıdakileri tekrar tekrar hatırlıyorum

ClassNotFoundException

Sınıf Hiyerarşisi

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

Hata ayıklama sırasında

  1. Gerekli jar, sınıf sınıfyolundan yok.
  2. Gerekli tüm kavanozların jvm sınıf yolunda olduğunu doğrulayın.

NoClassDefFoundError

Sınıf Hiyerarşisi

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

Hata ayıklama sırasında

  1. Düzgün derlenmiş bir sınıfı dinamik olarak yükleme sorunu
  2. Statik bloklar, yapıcılar, bağımlı sınıfın init () yöntemleri ve gerçek hata ile ilgili sorun birden fazla katman tarafından sarılır [özellikle bahar kullandığınızda, gerçek istisna sarılır ve NoClassDefError alırsınız]
  3. Bağımlı sınıfın statik bir bloğu altında "ClassNotFoundException" ile karşılaştığınızda
  4. Sınıf sürümleriyle ilgili sorun. Bu, farklı jar / paketler altında aynı sınıfın iki sürümü v1, v2 olduğunda, v1 kullanılarak başarıyla derlendiğinde ve v2, ilgili yöntemlere / değişkenlere sahip olmayan çalışma zamanında yüklendiğinde ve bu özel durumu göreceksiniz. [Bir keresinde sınıf yolunda görünen birden çok kavanoz altındaki log4j ile ilgili sınıfın kopyasını kaldırarak bu sorunu çözdüm]

-1

ClassNotFoundException ve NoClassDefFoundError, belirli bir sınıf çalışma zamanında bulunmadığında oluşur, ancak farklı senaryolarda ortaya çıkar.

ClassNotFoundException, Class.forName () veya loadClass () yöntemlerini kullanarak bir sınıfı çalışma zamanında yüklemeye çalıştığınızda oluşan bir istisnadır ve belirtilen sınıflar sınıfyolunda bulunmaz.

    public class MainClass
    {
        public static void main(String[] args)
        {
            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            }catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    }



    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at pack1.MainClass.main(MainClass.java:17)

NoClassDefFoundError, derleme zamanında belirli bir sınıf varsa, ancak çalışma zamanında eksik olduğunda oluşan bir hatadır.

    class A
    {
      // some code
    }
    public class B
    {
        public static void main(String[] args)
        {
            A a = new A();
        }
    }

Yukarıdaki programı derlediğinizde, iki .class dosyası oluşturulur. Biri A.class, diğeri B.class. A.class dosyasını kaldırır ve B.class dosyasını çalıştırırsanız, Java Çalışma Zamanı Sistemi NoClassDefFoundError'u aşağıdaki gibi atar:

    Exception in thread "main" java.lang.NoClassDefFoundError: A
    at MainClass.main(MainClass.java:10)
    Caused by: java.lang.ClassNotFoundException: A
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.