Rumah > Java > javaTutorial > teks badan

Pepijat ava teratas (dan Penyelesaiannya) Setiap Pembangun Perlu Tahu

WBOY
Lepaskan: 2024-09-03 11:40:44
asal
612 orang telah melayarinya

Top ava Bugs (and Their Solutions) Every Developer Should Know

Java telah menjadi kuasa besar dalam dunia pengaturcaraan selama beberapa dekad, menawarkan gabungan kebolehpercayaan, skalabiliti dan prestasi. Walau bagaimanapun, seperti mana-mana bahasa, ia bukan tanpa ciri dan perangkapnya. Dalam blog ini, kami akan meneroka 5 pepijat teratas yang biasa dihadapi oleh pembangun Java, bersama-sama dengan penyelesaian praktikal untuk mengelakkan atau membetulkannya. Sama ada anda seorang pembangun Java yang berpengalaman atau baru bermula, cerapan ini akan membantu anda menulis kod yang lebih bersih dan cekap.


1. Mimpi ngeri "NullPointerException"

Masalahnya

NullPointerException (NPE) mungkin merupakan pepijat yang paling terkenal di Jawa. Ia berlaku apabila kod anda cuba menggunakan rujukan objek yang batal. Ini boleh berlaku dalam pelbagai senario, seperti memanggil kaedah pada objek null, mengakses medan objek null, atau bahkan membuang null sebagai pengecualian.

Contoh

String str = null;
int length = str.length(); // NullPointerException
Salin selepas log masuk

Penyelesaian

Untuk mengelakkan NullPointerException, sentiasa semak nol sebelum menggunakan objek. Anda juga boleh menggunakan kelas Pilihan Java, yang diperkenalkan dalam Java 8, untuk mengendalikan potensi nilai nol dengan lebih anggun.

Pemeriksaan Null Tradisional

if (str != null) {
    int length = str.length();
} else {
    System.out.println("String is null");
}
Salin selepas log masuk

Menggunakan Pilihan

Optional<String> optionalStr = Optional.ofNullable(str);
int length = optionalStr.map(String::length).orElse(0);
Salin selepas log masuk

Rujukan

  • Memahami NullPointerException
  • Menggunakan Pilihan dalam Java

2. Pengecualian Pengubahsuaian Serentak: The Silent Crasher

Masalahnya

ConcurrentModificationException berlaku apabila koleksi diubah suai semasa mengulanginya, menggunakan kaedah seperti iterator(), forEach atau gelung untuk setiap. Ini boleh mengecewakan terutamanya kerana ia sering berlaku di luar jangkaan.

Contoh

List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
for (String item : list) {
    if ("two".equals(item)) {
        list.remove(item); // ConcurrentModificationException
    }
}
Salin selepas log masuk

Penyelesaian

Untuk mengelakkan ConcurrentModificationException, gunakan kaedah remove() iterator dan bukannya mengubah suai koleksi secara langsung. Sebagai alternatif, anda boleh menggunakan koleksi serentak seperti CopyOnWriteArrayList.

Menggunakan Iterator's remove()

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    if ("two".equals(item)) {
        iterator.remove(); // Safe removal
    }
}
Salin selepas log masuk

Menggunakan CopyOnWriteArrayList

List<String> list = new CopyOnWriteArrayList<>(Arrays.asList("one", "two", "three"));
for (String item : list) {
    if ("two".equals(item)) {
        list.remove(item); // Safe removal with no exception
    }
}
Salin selepas log masuk

Rujukan

  • Mengelakkan ConcurrentModificationException

3. Memori Bocor: Musuh Tersembunyi

Masalahnya

Pengumpulan sampah automatik Java sangat baik dalam mengurus ingatan, tetapi ia tidak mudah. Kebocoran ingatan berlaku apabila objek secara tidak sengaja disimpan dalam ingatan, menghalang pemungut sampah daripada menuntutnya semula. Ini boleh membawa kepada OutOfMemoryError dan merendahkan prestasi aplikasi dari semasa ke semasa.

Contoh

Satu punca biasa kebocoran memori ialah apabila objek ditambahkan pada koleksi statik dan tidak pernah dialih keluar.

public class MemoryLeakExample {
    private static List<String> cache = new ArrayList<>();

    public static void addToCache(String data) {
        cache.add(data);
    }
}
Salin selepas log masuk

Penyelesaian

Untuk mengelakkan kebocoran memori, berhati-hati tentang penggunaan koleksi statik anda dan pastikan objek dialih keluar apabila tidak diperlukan lagi. Alat seperti pemprofil dan pengesan kebocoran memori (cth., VisualVM, Eclipse MAT) boleh membantu mengenal pasti dan mendiagnosis kebocoran memori.

Membetulkan Contoh

public static void addToCache(String data) {
    if (cache.size() > 1000) {
        cache.clear(); // Avoid unbounded growth
    }
    cache.add(data);
}
Salin selepas log masuk

Rujukan

  • Memahami Kebocoran Memori dalam Java

4. ClassCastException: Kemalangan Tidak Dijangka

Masalahnya

ClassCastException berlaku apabila anda cuba menghantar objek ke subkelas yang bukan contoh. Ini biasanya berlaku apabila bekerja dengan koleksi atau kod warisan yang tidak menggunakan generik dengan betul.

Contoh

Object obj = "hello";
Integer num = (Integer) obj; // ClassCastException
Salin selepas log masuk

Penyelesaian

Untuk mengelakkan ClassCastException, sentiasa semak jenis sebelum menghantar, atau lebih baik lagi, gunakan generik untuk menguatkuasakan keselamatan jenis pada masa penyusunan.

Semakan Jenis Selamat

if (obj instanceof Integer) {
    Integer num = (Integer) obj;
}
Salin selepas log masuk

Menggunakan Generik

List<String> list = new ArrayList<>();
list.add("hello");
String str = list.get(0); // No casting needed
Salin selepas log masuk

Rujukan

  • Mengelakkan ClassCastException

5. Gelung Infinite: The CPU Hogger

Masalahnya

Gelung tak terhingga berlaku apabila gelung terus dilaksanakan selama-lamanya kerana keadaan gelung tidak pernah menjadi palsu. Ini boleh menyebabkan aplikasi anda hang, menggunakan semua CPU yang tersedia dan menjadi tidak responsif.

Contoh

while (true) {
    // Infinite loop
}
Salin selepas log masuk

Penyelesaian

Sentiasa pastikan gelung anda mempunyai syarat penamatan yang sah. Anda boleh menggunakan alat penyahpepijatan atau menambah pengelogan untuk mengesahkan bahawa gelung ditamatkan seperti yang dijangkakan.

Fixing the Example

int counter = 0;
while (counter < 10) {
    System.out.println("Counter: " + counter);
    counter++; // Loop will terminate after 10 iterations
}
Salin selepas log masuk

References

  • Preventing Infinite Loops in Java

Conclusion

While Java is a robust and reliable language, these common bugs can trip up even experienced developers. By understanding and implementing the solutions we've discussed, you can write more stable and maintainable code. Remember, the key to avoiding these pitfalls is to be aware of them and to adopt best practices that mitigate their impact. Happy coding!


Written by Rupesh Sharma AKA @hackyrupesh

Atas ialah kandungan terperinci Pepijat ava teratas (dan Penyelesaiannya) Setiap Pembangun Perlu Tahu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!