Pengecualian dalam Java adalah bahagian penting dalam pengaturcaraan yang mantap. Sesungguhnya, mereka membenarkan ralat diurus dengan cara yang teratur dan boleh diramal. Artikel ini meneroka sistem pengendalian pengecualian di Jawa secara mendalam, menyediakan amalan terbaik dan termasuk contoh dunia sebenar untuk menggambarkan konsep yang diliputi.
Di Java, pengecualian ialah peristiwa tidak dijangka yang berlaku semasa pelaksanaan program dan mengganggu aliran arahan biasa. Pengecualian membenarkan atur cara mengendalikan ralat tanpa ranap.
Contoh ralat mudah: bahagi dengan sifar:
public class DivisionParZero { public static void main(String[] args) { int a = 10; int b = 0; System.out.println(a / b); // Lève une ArithmeticException } }
Java mengklasifikasikan pengecualian kepada tiga kategori utama:
Pengecualian ini mesti ditangkap atau diisytiharkan dalam tandatangan kaedah dengan lontaran. Ia selalunya datang daripada acara luaran seperti akses fail atau sambungan rangkaian.
Pengecualian yang tidak ditandai mewarisi daripada RuntimeException dan tidak perlu ditangkap atau diisytiharkan. Ia selalunya terhasil daripada ralat pengaturcaraan.
Ralat dalam Java adalah serius, selalunya masalah berkaitan sistem yang biasanya tidak dapat dikendalikan oleh program.
Pengecualian ini merangkumi pelbagai kemungkinan ralat dalam Java, menyediakan asas yang komprehensif untuk mengendalikan pelbagai senario ralat dalam aplikasi.
Di Java, pengendalian pengecualian bergantung terutamanya pada cubaan, tangkapan, akhirnya, dan balingan blok. Berikut ialah gambaran keseluruhan terperinci penggunaannya:
Blok cuba merangkum kod yang boleh menjana pengecualian. Jika pengecualian berlaku, blok tangkapan yang sepadan dilaksanakan untuk menangkap dan mengendalikan pengecualian ini, menghalang program daripada ranap.
Contoh:
Mari bayangkan senario di mana kita ingin menukar rentetan kepada integer, tetapi rentetan itu mungkin bukan nombor yang sah.
public class DivisionParZero { public static void main(String[] args) { int a = 10; int b = 0; System.out.println(a / b); // Lève une ArithmeticException } }
Dalam contoh ini, jika pengguna memasukkan rentetan aksara yang tidak boleh ditukar kepada integer, seperti "abc", blok tangkapan menangkap NumberFormatException dan memaparkan mesej ralat, sekali gus mengelakkan gangguan program.
Blok akhirnya dilaksanakan selepas blok cuba dan tangkap, sama ada pengecualian dilemparkan atau tidak. Ia sering digunakan untuk mengosongkan sumber (contohnya, menutup fail atau sambungan rangkaian) untuk memastikan sumber sentiasa dibersihkan dengan betul.
Contoh:
public class GestionDesExceptions { public static void main(String[] args) { try { int number = Integer.parseInt("abc"); // Provoquera une NumberFormatException } catch (NumberFormatException e) { System.out.println("Erreur : la chaîne de caractères n'est pas un nombre valide."); } } }
Di sini, blok akhirnya menutup fail, sama ada ia ditemui atau tidak, untuk membebaskan sumber.
Kata kunci lontaran digunakan untuk membuang pengecualian secara eksplisit. Ini boleh berguna untuk pengesahan khusus dalam kod.
Contoh:
public class GestionDesExceptions { public static void main(String[] args) { FileReader fr = null; try { fr = new FileReader("fichier.txt"); // Lire le fichier } catch (FileNotFoundException e) { System.out.println("Erreur : fichier non trouvé."); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { System.out.println("Erreur lors de la fermeture du fichier."); } } } } }
Dalam contoh ini, lontaran secara eksplisit melemparkan IllegalArgumentException jika umurnya negatif, sekali gus menunjukkan ralat logik.
Kadangkala adalah lebih baik untuk menyebarkan pengecualian daripada menangkapnya dengan segera, terutamanya jika kaedah semasa tidak dapat mengendalikan pengecualian dengan betul. Ini dilakukan dengan kata kunci lontaran dalam pengisytiharan kaedah.
Contoh:
public class GestionDesExceptions { public static void main(String[] args) { try { validerAge(-5); } catch (IllegalArgumentException e) { System.out.println("Erreur : " + e.getMessage()); } } public static void validerAge(int age) { if (age < 0) { throw new IllegalArgumentException("L'âge ne peut pas être négatif."); } } }
Di sini, openFile menggunakan throws IOException, yang bermaksud ia membenarkan pemanggil mengendalikan pengecualian. Jika FileReader tidak dapat mencari fail, FileNotFoundException akan dibuang dan dihantar ke blok tangkapan kaedah utama.
Propagasi ini berguna dalam seni bina yang lebih kompleks di mana pengecualian perlu dikendalikan lebih tinggi dalam hierarki panggilan, contohnya, pada lapisan pembentangan untuk memaparkan mesej ralat kepada pengguna
5. Pengecualian TersuaiContoh Pengecualian Tersuai
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class PropagationException { public static void main(String[] args) { try { ouvrirFichier("fichier_inexistant.txt"); } catch (IOException e) { System.out.println("Erreur lors de l'ouverture du fichier : " + e.getMessage()); } } public static void ouvrirFichier(String nomFichier) throws IOException { FileReader lecteur = new FileReader(nomFichier); // Peut lever FileNotFoundException lecteur.close(); } }Kemudian kami menggunakannya dalam program utama kami untuk mengendalikan situasi di mana baki tidak mencukupi:
public class SoldeInsuffisantException extends Exception { public SoldeInsuffisantException(String message) { super(message); } }Dalam contoh ini, InsufficientBalanceException ialah pengecualian tersuai yang menunjukkan bahawa amaun yang akan dikeluarkan melebihi baki yang tersedia. Mengendalikan ralat ini secara khusus meningkatkan kebolehbacaan dan kebolehselenggaraan kod dengan menyediakan mesej ralat yang jelas.
Mari bayangkan sistem pengesahan pengguna di mana umur mestilah antara 18 dan 65 tahun. Kita boleh mencipta AgeInvalideException.
public class DivisionParZero { public static void main(String[] args) { int a = 10; int b = 0; System.out.println(a / b); // Lève une ArithmeticException } }
Penggunaan:
public class GestionDesExceptions { public static void main(String[] args) { try { int number = Integer.parseInt("abc"); // Provoquera une NumberFormatException } catch (NumberFormatException e) { System.out.println("Erreur : la chaîne de caractères n'est pas un nombre valide."); } } }
Di sini, AgeInvalideException dibuang jika umur tidak memenuhi syarat. Pengecualian tersuai ini menyediakan semakan pengesahan yang tepat dan jelas mesej ralat, meningkatkan pengalaman pengguna.
Pengendalian pengecualian dalam Java melalui percubaan, tangkap, akhirnya, dan pengecualian tersuai membolehkan kawalan ralat yang terperinci, kebolehbacaan kod yang lebih baik dan pengalaman pengguna yang lebih baik dalam aplikasi profesional.
Prinsip: Mesej pengecualian mestilah eksplisit untuk memberikan konteks yang tepat tentang ralat.
Amalan Buruk:
public class GestionDesExceptions { public static void main(String[] args) { FileReader fr = null; try { fr = new FileReader("fichier.txt"); // Lire le fichier } catch (FileNotFoundException e) { System.out.println("Erreur : fichier non trouvé."); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { System.out.println("Erreur lors de la fermeture du fichier."); } } } } }
Penambahbaikan:
Gunakan pengecualian khusus dan jelaskan mesej, dan lebih suka membuat pengecualian tersuai jika ia mencerminkan ralat umum khusus domain.
public class GestionDesExceptions { public static void main(String[] args) { try { validerAge(-5); } catch (IllegalArgumentException e) { System.out.println("Erreur : " + e.getMessage()); } } public static void validerAge(int age) { if (age < 0) { throw new IllegalArgumentException("L'âge ne peut pas être négatif."); } } }
Pengecualian tidak seharusnya mengatasi struktur kawalan seperti if-else. Menggunakan pengecualian dengan cara ini adalah mahal dari segi prestasi dan menjadikan kod kurang boleh dibaca.
Amalan Buruk:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class PropagationException { public static void main(String[] args) { try { ouvrirFichier("fichier_inexistant.txt"); } catch (IOException e) { System.out.println("Erreur lors de l'ouverture du fichier : " + e.getMessage()); } } public static void ouvrirFichier(String nomFichier) throws IOException { FileReader lecteur = new FileReader(nomFichier); // Peut lever FileNotFoundException lecteur.close(); } }
Penambahbaikan: Gunakan struktur kawalan biasa untuk mengendalikan jenis logik ini.
public class SoldeInsuffisantException extends Exception { public SoldeInsuffisantException(String message) { super(message); } }
Blok cuba-dengan-sumber memastikan sumber, seperti fail atau sambungan, ditutup secara automatik, walaupun sekiranya berlaku pengecualian.
Amalan Buruk:
public class CompteBancaire { private double solde; public CompteBancaire(double solde) { this.solde = solde; } public void retirer(double montant) throws SoldeInsuffisantException { if (montant > solde) { throw new SoldeInsuffisantException("Solde insuffisant pour ce retrait."); } solde -= montant; } public static void main(String[] args) { CompteBancaire compte = new CompteBancaire(100.0); try { compte.retirer(150.0); } catch (SoldeInsuffisantException e) { System.out.println(e.getMessage()); } } }
Penambahbaikan:
public class AgeInvalideException extends Exception { public AgeInvalideException(String message) { super(message); } }
Elakkan menangkap pengecualian umum seperti Exception atau Throwable, kerana ini boleh menyembunyikan ralat kritikal dan pepijat yang tidak dijangka. Menangkap pengecualian khusus menjadikan kod lebih mudah dibaca dan diselenggara.
Amalan Buruk:
public class ValidationUtilisateur { public static void validerAge(int age) throws AgeInvalideException { if (age < 18 || age > 65) { throw new AgeInvalideException("Âge invalide : doit être entre 18 et 65 ans."); } } public static void main(String[] args) { try { validerAge(17); } catch (AgeInvalideException e) { System.out.println(e.getMessage()); } } }
Penambahbaikan:Sasarkan pengecualian khusus untuk pengendalian ralat yang lebih tepat.
public class DivisionParZero { public static void main(String[] args) { int a = 10; int b = 0; System.out.println(a / b); // Lève une ArithmeticException } }
Pengelogan pengecualian memudahkan untuk menjejak dan menyelesaikan isu. Gunakan rangka kerja pengelogan seperti Log4j atau SLF4J untuk mengelog ralat, memilih tahap pengelogan yang sesuai (ralat, amaran, maklumat).
Amalan Buruk:
public class GestionDesExceptions { public static void main(String[] args) { try { int number = Integer.parseInt("abc"); // Provoquera une NumberFormatException } catch (NumberFormatException e) { System.out.println("Erreur : la chaîne de caractères n'est pas un nombre valide."); } } }
Penambahbaikan:
public class GestionDesExceptions { public static void main(String[] args) { FileReader fr = null; try { fr = new FileReader("fichier.txt"); // Lire le fichier } catch (FileNotFoundException e) { System.out.println("Erreur : fichier non trouvé."); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { System.out.println("Erreur lors de la fermeture du fichier."); } } } } }
Pengendalian pengecualian adalah lebih kompleks dalam persekitaran tak segerak, seperti dengan CompletableFuture, kerana ralat boleh berlaku di luar aliran pelaksanaan utama.
Contoh:
public class GestionDesExceptions { public static void main(String[] args) { try { validerAge(-5); } catch (IllegalArgumentException e) { System.out.println("Erreur : " + e.getMessage()); } } public static void validerAge(int age) { if (age < 0) { throw new IllegalArgumentException("L'âge ne peut pas être négatif."); } } }
Untuk membuang semula pengecualian sambil mengekalkan konteks awalnya, gunakan getCause(). Ini amat berguna apabila mengendalikan pengecualian dalam lapisan aplikasi yang lebih tinggi.
Contoh:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class PropagationException { public static void main(String[] args) { try { ouvrirFichier("fichier_inexistant.txt"); } catch (IOException e) { System.out.println("Erreur lors de l'ouverture du fichier : " + e.getMessage()); } } public static void ouvrirFichier(String nomFichier) throws IOException { FileReader lecteur = new FileReader(nomFichier); // Peut lever FileNotFoundException lecteur.close(); } }
Dalam contoh ini, e ialah punca awal dan boleh diambil oleh getCause() untuk kebolehkesanan yang lebih mudah.
Ujian unit memastikan pengecualian dilemparkan dan dikendalikan dengan betul. Dengan JUnit, kita boleh menyemak sama ada kaedah membuang pengecualian yang dijangkakan.
Contoh:
public class SoldeInsuffisantException extends Exception { public SoldeInsuffisantException(String message) { super(message); } }
Dalam contoh ini, assertThrows menyemak bahawa pembahagian membuang ArithmeticException sekiranya pembahagian dengan sifar.
Dengan mengikuti amalan terbaik ini untuk pengendalian pengecualian, anda boleh menjadikan kod Java anda lebih teguh dan boleh diselenggara. Pengendalian ralat yang baik bukan sahaja menjamin kestabilan aplikasi, tetapi ia juga meningkatkan kebolehkesanan ralat, sekali gus memudahkan penyahpepijatan dan penambahbaikan berterusan.
Ringkasnya, pengendalian pengecualian yang ketat dalam Java mengukuhkan kebolehpercayaan dan kebolehselenggaraan kod. Dengan mengguna pakai amalan terbaik — seperti mesej ralat yang jelas, penggunaan cuba-dengan-sumber yang bijak dan perhatian kepada kebolehbacaan dan kebolehujian pengecualian — kami mengelakkan gangguan yang tidak perlu dan menjamin pengalaman pengguna yang lebih stabil. Ini membolehkan ralat dikesan, difahami dan dibetulkan dengan cekap, sambil menyediakan asas kod yang teguh sedia untuk evolusi.
Atas ialah kandungan terperinci Pengendalian Pengecualian dalam Java: Panduan Lengkap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!