Takut ralat, tetapi jangan tulis dalam Java! Anda mungkin sudah mengetahui beberapa perkara tentang pengecualian dalam Java . Hari ini, sekurang-kurangnya ilmu yang cetek akan memberi manfaat kepada anda. Kami akan menganalisis kelas Ralat dan jenis pengecualian khas yang menakutkan ramai orang apabila ia muncul dalam surih tindanan mereka.

Di bahagian atas hierarki pengecualian Java ialah kelas Throwable , yang mempunyai dua keturunan:

  • Exception , yang bertanggungjawab untuk ralat dalam program anda.
  • Dan wira kami untuk hari ini — Ralat , yang bertanggungjawab untuk ralat dalam JVM.
    Perlu dinyatakan bahawa ini mungkin bukan pepijat pengekodan, tetapi masalah yang biasanya tidak bergantung kepada pemaju.

Apa yang perlu dilakukan dengan Ralat

Apabila menangkap "ralat", anda tidak boleh melakukan sebarang tindakan dalam blok tangkapan , kecuali untuk pengelogan , kerana kita bercakap tentang masalah dalam JVM itu sendiri.

Pengelogan adalah baik: apabila anda mendapat ralat masa jalan, anda boleh melihat log, melihat puncanya dan mengetahui perkara yang perlu diperbaiki.

Memandangkan anda tidak tahu jenis ralat yang mungkin anda perolehi apabila anda menulis kod anda, tidak masuk akal untuk menulis jenis tertentu dalam blok tangkapan . Menggunakan kelas Ralat itu sendiri juga bukan penyelesaian terbaik, kerana dalam kes ini, anda hanya akan menangkap ralat.

Oleh itu, adalah lebih baik untuk menggunakan kelas Throwable , yang boleh menangkap kedua-dua Ralat dan Pengecualian . Bagaimanakah ini kelihatan dalam amalan?

Ia tidak OK untuk menulis kod seperti ini:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Menulis kod seperti ini juga tidak OK:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Tetapi kod seperti ini OK:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

Pilihan kedua untuk mengendalikan ralat ialah membuangnya lebih tinggi selepas mengisytiharkan klausa lontaran pada kaedah tersebut. Teknik ini digunakan apabila kod anda secara teorinya boleh membuang ralat dan anda ingin memberi amaran kepada semua orang yang mungkin menggunakan kod anda supaya mereka boleh mengendalikan ralat dengan betul.

Kesilapan biasa

Beberapa ralat yang paling popular ialah kelas OutOfMemoryError dan StackOverflowError .

OutOfMemoryError sering muncul apabila atur cara tidak mempunyai memori yang mencukupi untuk mencipta objek dan pengumpul sampah tidak dapat mengikutinya. Hasilnya ialah OutOfMemoryError .

Java tidak membenarkan anda memadamkan objek secara manual untuk mengelakkan kebocoran memori, tetapi anda boleh mengelak membuang sampah supaya tidak terlalu menyusahkan pengumpul sampah dan tidak mengacaukan timbunan.

Sebagai contoh, kod seperti ini akan mencipta banyak sampah dalam ingatan:


while (true) {
    new Object();
}

Ralat kedua yang saya ingin beritahu anda ialah StackOverflowError , yang dilemparkan apabila timbunan melimpah. Memandangkan tindanan terutamanya menyimpan pembolehubah tempatan, parameter dan panggilan kaedah, rekursi (atau panggilan kaedah rekursif) adalah punca yang sangat biasa bagi ralat ini:


public void foo() {
    foo();
}

Untuk mengelakkan masalah semasa pelaksanaan program, IDE moden sering memberi amaran tentang kaedah panggilan secara rekursif.

Anda tidak boleh membetulkan program yang membuang Ralat , tetapi anda boleh menulis kod yang tidak akan membuang ralat dan memecahkan program anda. Perhatikan perkara yang anda lakukan dengan ingatan, cipta objek dengan berhati-hati dan panggil kaedah dengan betul. Jika anda berbuat demikian, maka anda akan mempunyai lebih sedikit masalah dalam kod anda.

Perbezaan antara jenis Ralat dan Pengecualian

ralat Pengecualian
Tidak boleh dibetulkan dalam blok tangkapan Boleh dikendalikan dalam blok tangkapan
Tidak berlaku pada masa penyusunan Boleh ditangkap pada masa penyusunan
Masalah dalam JVM Masalah dalam logik kod
Semua Ralat dinyahtandai _ disemak dan tidak disemak

Anda tidak boleh lari daripada pengecualian di Jawa, tetapi anda tidak perlu takut kepadanya. Anda hanya perlu memahami apa yang diwakili oleh setiap jenis dan tahu cara mengendalikannya. Itu sahaja untuk hari ini! jumpa lagi!