Java.lang.NoClassDefFoundError nasıl çözülür?


221

Oracle Java Tutorials hem örnek denedim . Her ikisi de iyi derler, ancak çalışma zamanında her ikisi de bu hatayla gelir:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    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:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

Sanırım Main.javadosya yanlış klasörde olabilir. Dizin hiyerarşisi şöyledir:

graphics
 Main.java
 shapes
|    Square.java
|    Triangle.java
 linepoint
|    Line.java
|    Point.java
 spaceobjects
|    Cube.java
|    RectPrism.java

Ve işte Main.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2,3,15);
        Line l = new Line(1,5,2,3);
        Cube c = new Cube(13,32,22);
    }
}

Burada neyi yanlış yapıyorum?

GÜNCELLEME

MainSınıfı graphicspakete koyduktan sonra (buna ekledim package graphics;), sınıfyolunu "_test" (grafik içeren klasör) olarak ayarlayın, derledi ve java graphics.Main(komut satırından) kullanarak çalıştırdı , işe yaradı.

Gerçekten geç GÜNCELLEME # 2

Eclipse (sadece Notepad ++ ve JDK) kullanmıyordum ve yukarıdaki güncelleme sorunumu çözdü. Bununla birlikte, bu cevapların çoğunun Eclipse ve IntelliJ için olduğu görülüyor, ancak benzer kavramları var.


1
Ana sınıfınıza bakıldığında, bir paket içinde değil ( package graphics;üstte olurdu ). graphicsPaket yapınızın başı mı ? Square package graphics.shapesen üstte mi?
lreeder

1
.Java dosyalarının nerede olduğunu listeliyorsunuz, ancak aldığınız şey bir çalışma zamanı sorunu olduğundan, gerçekten ilgilendiğiniz şey .class dosyalarının nerede olduğu ve sınıf yolunuzda olup olmadığıdır. Ana sınıfı nasıl yürütüyorsunuz?
Thor84no

İthalatınızı düzenlemek için tutulma içinde Shift + ctrl + o tuşlarına basın
happybuddha

Sınıf adını doğru yazdığınızdan emin olun. Bu hatayı alıyordum çünkü sınıf adına büyük harfle başlamadım
Jeremy Borg

Bu bazen büyük bir yeniden düzenleme işleminden sonra IntelliJ IDEA'da meydana gelir. Projenize sağ tıklayın ve -> Modülü Derle'yi seçin ve ardından projeyi yeniden başlatın; yeniden çalışmalıdır.
Zar

Yanıtlar:


223

Kodunuzu derledikten sonra .class, programınızdaki her sınıf için dosyalar ile sonuçlanırsınız . Bu ikili dosyalar, Java'nın programınızı yürütmek için yorumladığı bayt kodudur. NoClassDefFoundError(Bu durumda classloader belirten java.net.URLClassLoaderdinamik yükleme sınıfları sorumludur), bulamıyorum.class Kullanmak çalıştığınızı sınıf için dosyayı.

Gerekli sınıflar (kodlar yansıma ile yüklenmedikçe) yoksa kodunuz derlenmeyecektir, bu nedenle bu istisna genellikle sınıf yolunuzun gerekli sınıfları içermediği anlamına gelir. java.net.URLClassLoaderSınıf yükleyicinin (özellikle ) sınıf yolunuzdaki her girişte a / b / c / klasöründeki abc paketindeki sınıfları arayacağını unutmayın. NoClassDefFoundErrorayrıca, derlediğiniz ve kullanmaya çalıştığınız bir .jar dosyasına geçişli bir bağımlılığın eksik olduğunu da gösterebilir.

Örneğin, bir sınıfınız varsa com.example.Foo, derledikten sonra bir sınıf dosyanız olacaktır Foo.class. Diyelim ki çalışma dizininiz .../project/. Bu sınıf dosyası yerleştirilmelidir .../project/com/exampleve sınıf yolunuzu olarak ayarlarsınız .../project/.

Yan not: Java ve JVM dilleri için var olan şaşırtıcı araçlardan yararlanmanızı tavsiye ederim. Eclipse ve IDEA gibi modern IDE'ler ve Maven veya Gradle gibi yönetim araçları oluşturmak, sınıfyolları hakkında endişelenmenize ve koda odaklanmanıza yardımcı olmayacak! Bununla birlikte, bu bağlantı , komut satırında yürüttüğünüzde sınıfyolunun nasıl ayarlanacağını açıklar.


Android'de bir birim testi çalıştırmaya çalışırken karşılaştığım bir hata nedeniyle bunu okuyorum. Benim durumumda, NoClassDefFoundError testinde eksik bağımlılıkların bir sonucu olarak ortaya çıktı. Bunun gibi hataları önlemek için bağımlılık enjeksiyonunu düşünmem gerekiyor. Ayrıntılı cevap için teşekkürler.
tipik danny

130

Başkalarının bakış açısını düzeltmek istiyorum NoClassDefFoundError.

NoClassDefFoundError gibi çeşitli nedenlerle ortaya çıkabilir

  1. ClassNotFoundException - Derleme zamanında kullanılabilir olup olmadığına bakılmaksızın başvurulan sınıf için .class bulunamadı (örn. Base / child sınıfı).
  2. Sınıf dosyası bulundu, ancak statik değişkenler başlatılırken İstisna oluşturuldu
  3. Sınıf dosyası bulundu, statik bloklar başlatılırken kural dışı durum yükseltildi

Orijinal soruda, CLASSPATH'ı başvurulan sınıflar jar dosyasına veya paket klasörüne ayarlayarak düzeltilebilen ilk durum buydu.

"Derleme zamanında kullanılabilir" diyerek anlamı nedir?

  • Başvurulan sınıf kodda kullanılır.
    Örneğin: A ve B olmak üzere iki sınıf (A'yı genişletir). B doğrudan kodda belirtilmişse, derleme zamanında kullanılabilir, yani A a = yeni B ();

"Derleme zamanında kullanılamaz" diyerek ne anlama geliyor?

  • Derleme zamanı sınıfı ve çalışma zamanı sınıfı farklıdır, örneğin, temel sınıf alt sınıf sınıf adı kullanılarak yüklenir, örneğin Class.forName ("classname")
    Ör: İki sınıf, A ve B (A'yı genişletir). Kodda
    A a = Class.forName ("B") var. NewInstance ();

Benim durumumda, bir sınıf derledim, onlar app adlı bir dizine taşındı. package app;Alt dizin uygulamasına taşımadan önce bir satır eklemek ve yeniden derlemek zorunda kaldım .
taco

1
Yukarıda listelenen 3 dışında, ClassLoaders da temelde ClassNotFoundException olan böyle bir hataya neden olabilir, bu senaryoda sınıf sınıfyolunda mevcut olabilir, ancak farklı ClassLoader
Fahad

2 ve 3 sınıf yükleyiciye özgüdür. Javadoc'a göre, istisna sadece 1. sebep içindir.
Samuel

1
Vaka 2 ve vaka 3'ü test ettim, 'NoClassDefFoundError değil, ExceptionInInitializerError Case 2.Class dosyası bulundu, ancak statik değişkenler başlatılırken Exception ortaya çıktı Case 3.Class dosyası, Statik bloklar başlatılırken istisna oluştu
Michael

1
@Michael, Bu bağlantı, yığın izlemenizin NoClassDefFoundErrorbu durum için de gösterileceğini söylüyor : archive.is/YPbYI#selection-2107.0-2115.13
Pacerier

15

NoClassDefFoundErrorsınıfın sınıf yolunda mevcut olduğu Compile time, ancak sınıf yolunda bulunmadığı anlamına gelir Runtime.

Eclipse kullanıyorsanız , dosyada shapes, linepointsve spaceobjectsas girişlerinin bulunduğundan emin olun .classpath.


1
Bunu try / catch ile çalışma zamanında nasıl halledebilirim ?
Maveň ツ

5
Bu cevap yazma şekliniz doğru değil. Doğru olurdu: "Bu hatanın bir olası nedeni ...." Ancak, örneğin bir sınıf yükleyici ile çalışma zamanında bir JAR dosyası yüklerken bu hatayı almanın başka nedenleri olabilir.
Elmue

13

derlerken ve çalıştırırken bu hatalardan birini aldıysanız:

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello 
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        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)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

-------------------------- ÇÖZÜM -----------------------

sorun çoğunlukla paket organizasyonundadır. Sınıflarınızı, kaynak kodunuzdaki paket sınıflandırmalarıyla ilgili klasörler halinde düzenlemelisiniz.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]

"-D." javac komut hile yapar, yerine paketleri klasör yapısı oluşturmak yerine tüm .class dosyaları kök dizine koyarak, teşekkürler!
Jorge Sampayo

9
java.lang.NoClassDefFoundError

, derleme sırasında bir şey bulunduğunu ancak çalışma zamanında bulunmadığını gösterir . belki de sadece sınıf yoluna eklemelisin.


15
Bu nasıl yapılır?
Narendra Singh

istediğin bağlama bağlı.
sschrass

6

Sınıf Yolu'nda amaçlanan sınıf bulunamadığında Sınıf Tanımı Özel Durumu oluşmaz. Derleme Zamanı Sınıfında: Java Derleyicisinden Sınıf oluşturuldu, ancak Bir Şekilde Çalışma Zamanında Bağımlı Sınıf bulunamadı.

Basit bir örnek verelim:

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

Şimdi yukarıdaki iki Java Kaynak Kodu bazı Klasör yerleştirildi varsayalım "NoClassDefinationFoundExceptionDemo" diyelim

Şimdi bir kabuk açın (Java'nın zaten doğru ayarlandığını varsayarsak)

  1. "NoClassDefinationFoundExceptionDemo" Klasörüne Git
  2. Java Kaynak Dosyaları derleyin javac ClassB javac ClassA
  3. Her iki dosya da başarıyla derlendi ve ClassA.class ve ClassB.class ile aynı klasörde oluşturulan Class dosyaları
  4. Şimdi ClassPath'i geçerli çalışma dizinine geçirdiğimiz için aşağıdaki java -cp komutunu çalıştırıyoruz . ClassA ve Başarıyla çalıştı ve ekranda Çıktı göreceksiniz
  5. Şimdi Diyelim ki, ClassB.class dosyasını Present Directory'den kaldırdınız. ve şimdi komutu tekrar çalıştırıyorsunuz. java -cp. ClassA Şimdi sizi NoClassDefFoundException ile karşılayacak. ClassA bağımlılığı olan ClassB olarak sınıf yolunda (yani mevcut çalışma dizini) bulunmaz.

5

Java'da NoClassDefFoundError:

Tanım:

Derleme zamanı sırasında bir sınıf varsa, ancak çalışma zamanı sırasında java sınıfyolunda yoksa NoClassDefFoundError gelir. Normalde NoClassDefFoundError aldığınızda günlükte aşağıdaki satırı göreceksiniz: "main" iş parçacığında istisna java.lang.NoClassDefFoundError

Olası Nedenler:

  1. Sınıf, Java Sınıfyolunda kullanılamaz.

  2. Jar komutunu kullanarak programınızı çalıştırıyor olabilirsiniz ve sınıf manifest dosyasının ClassPath özniteliğinde tanımlanmadı.

  3. Tüm başlangıç ​​komut dosyaları Classpath ortam değişkenini geçersiz kılar.

  4. NoClassDefFoundError java.lang.LinkageError öğesinin bir alt sınıfı olduğundan, yerel kitaplık gibi bağımlılıklarından biri kullanılamıyorsa da gelebilir.

  5. Günlük dosyanızda java.lang.ExceptionInInitializerError öğesini kontrol edin. Statik başlatma başarısızlığı nedeniyle NoClassDefFoundError oldukça yaygındır.

  6. J2EE ortamında çalışıyorsanız, Class'ın birden fazla Classloader arasında görünürlüğü de java.lang.NoClassDefFoundError'a neden olabilir, ayrıntılı tartışma için örnekler ve senaryo bölümüne bakın.

Muhtemel Kararlar:

  1. Gerekli tüm Java sınıflarının uygulamanın sınıf yoluna dahil edildiğini doğrulayın. En yaygın hata, bazı harici kütüphanelere bağımlılığı olan bir Java uygulamasını yürütmeye başlamadan önce gerekli tüm sınıfları içermemektir.

  2. Uygulamanın sınıf yolu doğru, ancak uygulamanın yürütülmesinden önce Classpath ortam değişkeni geçersiz kılınıyor.

  3. Yukarıda belirtilen ExceptionInInitializerError öğesinin uygulamanızın yığın izlemesinde görünmediğini doğrulayın.

Kaynaklar:

Java J2EE java.lang.NoClassDefFoundError çözmek için 3 yolu

java.lang.NoClassDefFoundError - No Class Def bulundu hatası nasıl çözülür


3

Projeniz benzer bir paket içindeyse com.blahcodeve sınıfınız çağrılırsa Main, derlenen dosyalar gibi bir dizin yapısında çıkartılabilir ./out/com/blahcode/Main.class. Bu özellikle IntelliJ IDEA için geçerlidir.

Bir kabuk veya cmd çalıştırmak çalışırken, gereken cdiçeren Buna combir alt dizin olarak.

cd out
java -classpath . com.blahcode.Main

1

Birkaç ay boyunca bir NetBeans projesi üzerinde çalıştıktan sonra, aniden "Düşük Bellek" uyarısı aldıktan kısa bir süre sonra NoClassDefFoundError mesajını aldım. Temiz bir yeniden yapılandırma yapmak yardımcı olmadı, ancak Netbeans'ı tamamen kapatmak ve projeyi yeniden açmak hata raporu yoktu.


1

Bu yanıt, bir hizmette gerçekleşen java.lang.NoClassDefFoundError öğesine özgüdür :

Ekibim kısa bir süre önce bir hizmet sağlayan bir rpm'yi yükselttikten sonra bu hatayı gördü. Rpm ve içindeki yazılım Maven ile inşa edilmişti, bu yüzden rpm'ye dahil edilmemiş bir derleme zaman bağımlılığı vardı.

Ancak, araştırılırken bulunamayan sınıf, yığın izlemesindeki birkaç sınıfla aynı modüldeydi. Dahası, bu sadece yapıya yakın zamanda eklenen bir modül değildi. Bu gerçekler bunun bir Maven bağımlılığı sorunu olmayabileceğini gösterdi.

Nihai çözüm: Hizmeti yeniden başlatın!

Devir / dakika yükseltmesi, temel jar dosyasındaki hizmetin dosya tanıtıcısını geçersiz kılmış gibi görünüyor. Hizmet daha sonra belleğe yüklenmemiş bir sınıfı gördü, jar dosyası tutamaçları listesinde aradı ve sınıfı yükleyebileceği dosya tanıtıcısı geçersiz kılındığı için onu bulamadı. Hizmeti yeniden başlatmak, tüm dosya tanıtıcılarını yeniden yüklemeye zorladı, bu da rpm yükseltmesinden hemen sonra bellekte bulunmayan sınıfı yüklemesine izin verdi.

Umarım bu dava birine yardım eder.


1

Bugün sorunla karşılaştım. Bir Android projem var ve projeyi etkinleştirdikten sonra multidexartık başlamıyor.

Bunun nedeni, eklenecek Application classve diğer her şeyden önce çağrılması gereken belirli multidex yöntemini çağırmayı unutmuş olmamdı .

 MultiDex.install(this);

Multidex'i doğru şekilde etkinleştirmek için bu öğreticiyi izleyin. https://developer.android.com/studio/build/multidex.html

Bu satırları Uygulama sınıfınıza eklemelisiniz

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

1

Projem için, sorunu çözen şey, Chrome tarayıcısının ve krom sürücüsünün uyumlu olmadığıydı. Sürücünün tarayıcıyı bile açamayan çok eski bir sürümü vardı. Her ikisinin de son sürümünü indirdim ve problem çözüldü. Sorunu nasıl keşfettim? Projemi, uygulamamın kullandığı eski bir FF sürümüyle Selenium yerel firefox sürücüsünü kullanarak çalıştırdığımdan, sorunun tarayıcı ve sürücü arasındaki uyumsuzluk olduğunu fark ettim.

Umarım bu benim gibi benzer bir sorunu olan, aynı Hata Mesajını üreten herkese yardımcı olabilir.


0

Bu zincirdeki iki sentim:

Sınıf yolunun ( yerine ) tam yollar içerdiğinden emin olun, aksi halde yine de hata ile karşılaşabilirsiniz./home/user/lib/some_lib.jar~/lib/some_lib.jarNoClassDefFoundError


Bu kısmen doğrudur, ancak daha karmaşıktır. 1) yapabilirsiniz sınıf yolunda göreli yollar kullanmak, ancak JVM geçerli dizinine göre JVM ... çözülebilir olmalıdır. Bu onları kırılgan yapar . 2) yapabilirsiniz kullanmak ~bir sınıf yolu ortam değişkeni, ancak yalnızca değişken gerçek yol adlarının onları genişletir ayarlamak için kullandığınız mekanizma sağlandığında ve diğer kabuk meta karakter. Kullanıyorsanız bash, "karışık" sonuçlar elde edebilirsiniz. Örneğin echo ~:~, komut satırına yazdığınızda ne elde ettiğinize bakın . Birincisi ~genişletildi, ikincisi değil.
Stephen C

0

Çalışma zamanı sınıf yükleyicisi tarafından yüklenen sınıflar, java kök yükleyicisi tarafından zaten yüklenen sınıflara erişemediğinde NoClassFoundError alıyorum. Farklı sınıf yükleyicileri farklı güvenlik etki alanlarında olduğu için (java'ya göre) jvm, rootloader tarafından önceden yüklenmiş sınıfların çalışma zamanı yükleyici adres alanında çözümlenmesine izin vermez.

Programınızı 'java -javaagent: tracer.jar [YOUR java ARGS]' ile çalıştırın

Yüklenen sınıfı ve sınıfı yükleyen envanteri gösteren çıktı üretir. Bir sınıfın neden çözülemediğini izlemek çok yararlı.

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

0

Android Studio'da başıma geldi.

Benim için işe yarayan çözüm: sadece stüdyoyu yeniden başlatın.


0

Android Studio'yu kullanarak Android geliştirmemde de aynı sorunu yaşadım. Sunulan çözümler geneldir ve bana yardımcı olmadı (en azından benim için). Saatlerce araştırmadan sonra aşağıdaki çözümü buldum ve android stüdyosunu kullanarak geliştirme yapan android geliştiricilerine yardımcı olabilirim. ayarı aşağıdaki gibi değiştirin Tercihler -> Derleme, Yürütme, Dağıtım -> Anında Çalıştırma -> ilk seçeneğin işaretini kaldırın.

Bu değişiklikle birlikte hazırım. Umarım geliştirici arkadaşlarıma yardımcı olur.


0

Bu istisna için bir hata kaynağı, Proguard için tutarsız tanımlardan kaynaklanabilir, örn.

-libraryJars "path.to.a.missing.jar.library".

Bu, kavanozun orada olduğu göz önüne alındığında, derleme ve çalışmanın neden iyi çalıştığını, temiz ve derleme başarısız olduğunu açıklar. Koruma kurulumunda yeni eklenen kavanoz kitaplıkları tanımlamayı unutmayın!

Proguard'dan gelen hata mesajlarının gerçekten standartlara uygun olmadığını unutmayın, çünkü kavanoz orada olmadığında gelen benzer karınca mesajlarıyla kolayca karıştırılabilirler. Sadece en altta belada küçük bir koruma ipucu olacak. Bu nedenle, geleneksel sınıf yolu hataları vb. Aramaya başlamak oldukça mantıklıdır, ancak bu boşuna olacaktır.

Açıkça görülüyor ki, NoClassDefFound istisnası çalıştırılırken elde edilen sonuçlar olacaktır; Bazıları buna "Cehennem" diyorlar


0

Kullandığım Eclipse için FileSync eklentisi Tomcat üzerinde hata ayıklama yaşayabilir & aldığım yüzden NoClassFoundErrorben için bir senkronizasyon girişi eklendi çünkü binEclipse çalışma alanında dizinde => classesyer metadataTomcat için değil, aynı zamanda bir klasör senkronizasyonu eklendi olmasaydı extlibEclipse dizinde=>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib


0

RCP (Rich Client Platform) olarak da bilinen Eclipse tabanlı bir uygulama geliştiriyorum . Yeniden düzenleme işleminden sonra bu problemle karşı karşıya kaldım (bir sınıfı bir plugIn'den yeni bir klasöre taşımak).

Projenin temizlenmesi ve Maven güncellemesi yardımcı olmadı.

Sorun, otomatik olarak güncellenmeyen Bundle-Activator'dan kaynaklandı . Yeni PlugIn'de MANIFEST.MF altında Bundle-Activator'ın manuel olarak güncellenmesi sorunumu düzeltti.


0

yakın zamanda böyle android stüdyosuna multidex desteği eklediyseniz:

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

böylece çözümünüz Uygulama yerine MultiDexApplication'dan genişletilir.

public class MyApp extends MultiDexApplication {

0

Birden fazla modül kullanıyorsanız,

dexOptions {
    preDexLibraries = false
}

oluşturun.


0

Sınıfınızda statik bir işleyici olup olmadığını kontrol edin. Eğer öyleyse, lütfen dikkatli olun, çünkü statik işleyici sadece bir lüper olan iplikte başlatılabilir, çökme bu şekilde tetiklenebilir:

1. ilk olarak, basit bir iş parçacığında sınıf örneğini oluşturun ve çökmeyi yakalayın.

2. daha sonra ana iş parçacığında Class alan yöntemini çağırın, NoClassDefFoundError alacaksınız.

İşte test kodu:

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

onCrete Ana etkinlik yönteminizde test kodu bölümünü ekleyin:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

bir işleyici kullanarak düzeltmenin basit bir yolu var

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}

0

Test sınıflarını modül dışında kullanmayın

Bir çözümüm yok, sadece "derleme sırasında mevcut, çalışma zamanında yok" durumunun başka bir lezzeti yok.

Farklı bir modülde bulunan başka bir test sınıfından bir JUnit test sınıfından çok uygun bir yöntem kullanmaya çalışıyordum. Test kodu paketli kavanozun bir parçası olmadığı için bu hayır-hayır, ama fark etmedim çünkü Eclipse içinden kullanıcı sınıfı için görünür görünüyor.

Benim çözüm yöntem üretim kodunun bir parçası olan varolan bir yardımcı sınıfına yerleştirmek oldu.


0

Çevremde, birim testte bu sorunla karşılaşıyorum. * .Pom dosyasına bir kütüphane bağımlılığı ekledikten sonra bu düzeltildi.

Örneğin:

hata mesajı:

java.lang.NoClassDefFoundError: com/abc/def/foo/xyz/Iottt

pom:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>

0

Git dalı değişikliğinden sonra bu hatayı aldım. Belirli Eclipse durumunda, org.eclipse.wst.common.component dosyası için .settings dizininde eksik satırlar vardı. Aşağıda görebileceğiniz gibi

Maven Install ile proje bağımlılıklarını geri yüklemek yardımcı olacaktır.

resim açıklamasını buraya girin


0

kullanıyorsanız gradlew, gidin ./gradle/wrapper/gradle-wrapper.propertiesve değiştirindistributionUrl sınıfın doğru sürümüne .

JDK14 kullanıyorsanız deneyin

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

-1

Genymotion cihazlarımda çok şey oluyor. Genymotion'un kurulu olduğu sürücünüzde yeterli miktarda bellek bulunduğundan emin olun.


Bunun için referansınız var mı?
Wai Ha Lee

Hayır, düzenli olarak disk alanım tükeniyor ve iyi bir miktar serbest bırakmadıkça + bir Genymotion sanal cihazı kaldırmadıkça / yeniden kurmadıkça bu hatayı almaya devam ediyorum.
totteire
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.