public class PropHolder {
public static Properties prop;
static {
//code for loading properties from file
}
}
// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
class PropHolder
adalah kelas saya sendiri. Kelas berada di file JAR yang sama dari kelas utama. Jadi itu seharusnya tidak karena ada JAR yang hilang dari classpath.
Ketika saya melihat ke dalam file JAR oleh jar tf myjarfile
, saya bisa melihat yang PropHolder.class
tercantum di sana.
Btw: kodenya berjalan dengan baik di mesin lokal saya. Tetapi tidak bisa bekerja ketika saya menyebarkannya dengan beberapa skrip ke server Linux. Jadi saya pikir itu bukan masalah kode. Tetapi untuk beberapa alasan. proses penyebaran sangat sulit dilacak.
Apa yang bisa menjadi masalah?
Jawaban:
Taruhan terbaik saya adalah ada masalah di sini:
Akan muncul beberapa pengecualian tanpa tertangkap terjadi dan disebarluaskan ke ClassLoader yang sebenarnya mencoba memuat kelas. Kami akan membutuhkan stacktrace untuk mengkonfirmasi ini.
Entah itu atau itu terjadi ketika membuat
PropHolder.prop
variabel statis.sumber
static
masalah itu. Apa yang perlu dilakukan untuk menyelesaikan masalah?static
blok. Untuk debug, letakkan ditry/catch(Exception e)
sekitar seluruh blok dan catat pengecualian. Anda harus memperbaiki pengecualian itu. Biasanya pengecualian akan dicatat tetapi mungkin sulit ditemukan karena sedang dicatat selama pemuatan kelas yang mungkin terjadi sangat awaltry catch
blok dan katanyaFailed to initialize ClassA
. Saya pikir ini masalahJVM
. Saya me-restart sistem saya dan kemudian semuanya bekerja dengan baik. Bagaimana saya mengatasi masalah ini di masa depan tanpa me-restart sistem saya dan menyelesaikan masalah dengan solusi sederhana.cause
jika tersedia. ANoClassDefFoundError
selalu dikaitkan dengan kesalahan lain, Anda harus mencarinya di log atau mencoba untuk log lebih tepat (seperti memaksa masuk ke file baru pada sistem file)Anda mendapatkan
java.lang.NoClassDefFoundError
yang TIDAK berarti bahwa kelas Anda hilang (dalam hal ini Anda akan mendapatkanjava.lang.ClassNotFoundException
). ClassLoader mengalami kesalahan saat membaca definisi kelas ketika mencoba membaca kelas.Masukkan try / catch di dalam initializer statis Anda dan lihat pengecualiannya. Jika Anda membaca beberapa file di sana dan berbeda dari lingkungan lokal Anda, kemungkinan besar penyebab masalahnya (mungkin file tidak dapat ditemukan, tidak ada izin, dll.).
sumber
@Stateless
, jadi saya hanya menambahkan ketergantungan yang sesuai dan dapat melanjutkan lebih jauh. Terima kasih atas tipnya!NoClassDefFoundError tidak memberikan banyak petunjuk tentang apa yang salah di dalam blok statis. Merupakan praktik yang baik untuk selalu memiliki blok seperti ini di dalam kode inisialisasi {...} statis:
sumber
Saya memiliki pengecualian yang sama, ini adalah bagaimana saya memecahkan masalah:
Prasyarat:
Kelas Junit (dan tes), yang memperpanjang kelas lain.
ApplicationContext diinisialisasi menggunakan pegas, yang init proyek.
Konteks aplikasi diinisialisasi dalam metode @Before
Larutan:
Init konteks aplikasi dari metode @BeforeClass, karena kelas induk juga memerlukan beberapa kelas yang diinisialisasi dari dalam konteks aplikasi.
Semoga ini bisa membantu.
sumber
Seperti disebutkan di atas, ini bisa menjadi beberapa hal. Dalam kasus saya, saya memiliki variabel diinisialisasi statis yang bergantung pada entri yang hilang di file properti saya. Menambahkan entri yang hilang ke file properti dan masalahnya selesai.
sumber
Beberapa hari yang lalu, saya bertemu pertanyaan yang sama seperti pertanyaan Anda. Semua kode berjalan dengan baik di mesin lokal saya, tetapi ternyata kesalahan (noclassdeffound & inisialisasi). Jadi saya memposting solusi saya, tetapi saya tidak tahu mengapa, saya hanya mengajukan kemungkinan. Saya harap seseorang yang tahu akan menjelaskan ini. @ John Vint Pertama, saya akan menunjukkan masalah saya. Kode saya memiliki variabel statis dan blok statis keduanya. Ketika saya pertama kali menemukan masalah ini, saya mencoba solusi John Vint, dan mencoba menangkap pengecualian. Namun, saya tidak menangkap apa pun. Jadi saya pikir itu karena variabel statis (tapi sekarang saya tahu mereka adalah hal yang sama) dan masih belum menemukan apa pun. Jadi, saya mencoba mencari perbedaan antara mesin linux dan komputer saya. Kemudian saya menemukan bahwa masalah ini terjadi hanya ketika beberapa utas berjalan dalam satu proses (Omong-omong, mesin linux memiliki inti ganda dan proses ganda). Itu berarti jika ada dua tugas (keduanya menggunakan kode yang memiliki blok statis atau variabel) berjalan dalam proses yang sama, itu salah, tetapi jika mereka berjalan dalam proses yang berbeda, keduanya ok. Di mesin Linux, saya menggunakan
untuk menjalankan tugas, dan karena variabel statis saya adalah memulai sebuah wadah (atau mungkin Anda menginisialisasi classloader baru), maka itu akan tetap sampai jvm berhenti, dan jvm berhenti hanya ketika semua tugas dalam satu proses berhenti. Setiap tugas akan memulai sebuah wadah baru (atau classloader) dan itu membuat jvm bingung. Akibatnya, kesalahan terjadi. Lantas, bagaimana cara mengatasinya? Solusi saya adalah menambahkan perintah baru ke perintah pakar, dan membuat setiap tugas pergi ke wadah yang sama.
Mungkin Anda sudah memecahkan masalah ini, tetapi masih berharap itu akan membantu orang lain yang mengalami masalah yang sama.
sumber
java.lang.ExceptionInInitializerError: null
itu artinya tidak dapat menemukan kelas di classloader, atau tidak tahu memuat yang mana (kurasa). Apakah kamu memenuhi itu?Saya memiliki pengecualian yang sama - tetapi hanya ketika menjalankan dalam mode debug, ini adalah bagaimana saya memecahkan masalah (setelah 3 hari penuh): di build.gradle saya punya: "multiDexEnabled true" yang diatur di bagian defaultConfig.
tetapi ternyata ini tidak cukup. tetapi ketika saya berubah:
untuk:
ini menyelesaikannya. Semoga ini bisa membantu seseorang
sumber
Jika Anda mengerjakan proyek Android, pastikan Anda tidak memanggil metode statis apa pun di kelas Android mana pun. Saya hanya menggunakan JUnit + Mockito, jadi mungkin beberapa kerangka kerja lain dapat membantu Anda menghindari masalah sama sekali, saya tidak yakin.
Masalah saya memanggil
Uri.parse(uriString)
sebagai bagian dari penginisialisasi statis untuk pengujian unit. Kelas Uri adalah API Android, itulah sebabnya unit test build tidak dapat menemukannya. Saya mengubah nilai ininull
sebagai gantinya dan semuanya kembali normal.sumber
Saya memiliki masalah yang sama :java.lang.NoClassDefFoundError: Tidak dapat menginisialisasi kelas com.xxx.HttpUtils
itu adalah masalah lingkungan. Itu berarti properti di application.yml salah atau kosong!
sumber
Saya mengalami masalah yang sama. Saya memulai objek kacang di blok statis seperti di bawah ini:
Hanya karena proses inisiasi kacang obejct saya menyebabkan NPE, saya mendapatkan masalah. Jadi saya pikir Anda harus memeriksa blok kode statis Anda dengan hati-hati.
sumber