Rumah > Java > javaTutorial > teks badan

Pengendalian Pengecualian dalam Java: Panduan Lengkap

Susan Sarandon
Lepaskan: 2024-11-06 07:17:02
asal
878 orang telah melayarinya

Gestion des Exceptions en Java : Guide Complet

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.

1. Pengenalan kepada Pengecualian

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
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

2. Jenis Pengecualian di Jawa

Java mengklasifikasikan pengecualian kepada tiga kategori utama:

2.1. Pengecualian yang disemak

Pengecualian ini mesti ditangkap atau diisytiharkan dalam tandatangan kaedah dengan lontaran. Ia selalunya datang daripada acara luaran seperti akses fail atau sambungan rangkaian.

  • IOException: Berlaku apabila operasi input/output gagal. Contohnya, mengakses fail yang tidak wujud (FileNotFoundException).
  • SQLException: Berlaku semasa ralat manipulasi pangkalan data.
  • ClassNotFoundException: Pengecualian dilemparkan apabila JVM tidak dapat mencari kelas yang ditentukan.
  • InstantiationException: Apabila percubaan dibuat untuk membuat instantiate kelas atau antara muka abstrak.
  • InterruptedException: Berlaku apabila urutan menunggu terganggu.
  • ParseException: Disebabkan oleh ralat semasa menghuraikan data, terutamanya untuk tarikh.

2.2. Pengecualian tidak ditandai

Pengecualian yang tidak ditandai mewarisi daripada RuntimeException dan tidak perlu ditangkap atau diisytiharkan. Ia selalunya terhasil daripada ralat pengaturcaraan.

  • NullPointerException: Cuba untuk menggunakan rujukan nol.
  • ArrayIndexOutOfBoundsException: Akses kepada indeks tatasusunan yang tidak sah.
  • ArithmeticException: Operasi matematik tidak sah, seperti bahagi dengan sifar.
  • IllegalArgumentException: Menggunakan hujah yang tidak sesuai dalam kaedah.
  • NumberFormatException: Menukar rentetan bukan angka kepada nombor (cth. Integer.parseInt("abc")).
  • IllegalStateException: Memanggil kaedah dalam keadaan objek yang tidak sesuai.

2.3. Kesilapan

Ralat dalam Java adalah serius, selalunya masalah berkaitan sistem yang biasanya tidak dapat dikendalikan oleh program.

  • OutOfMemoryError: Dibangkitkan apabila JVM kehabisan memori.
  • StackOverflowError: Berlaku apabila rekursi yang berlebihan melebihi saiz tindanan.
  • VirtualMachineError: Kelas induk untuk ralat JVM kritikal, seperti InternalError dan UnknownError.
  • AssertionError: Ralat yang dicetuskan oleh kegagalan penegasan.

Beberapa pengecualian khusus lain yang diketahui

  • StringIndexOutOfBoundsException: Apabila cuba mengakses kedudukan aksara di luar sempadan dalam rentetan.
  • ClassCastException: Cuba untuk menghantar objek kepada jenis yang tidak serasi.
  • UnsupportedOperationException: Memanggil operasi yang tidak disokong oleh pelaksanaan semasa.
  • ConcurrentModificationException: Pengubahsuaian koleksi semasa lelaran.

Pengecualian ini merangkumi pelbagai kemungkinan ralat dalam Java, menyediakan asas yang komprehensif untuk mengendalikan pelbagai senario ralat dalam aplikasi.

3. Mengendalikan Pengecualian

Di Java, pengendalian pengecualian bergantung terutamanya pada cubaan, tangkapan, akhirnya, dan balingan blok. Berikut ialah gambaran keseluruhan terperinci penggunaannya:

cuba dan tangkap blok

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
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.

akhirnya sekat

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.");
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Di sini, blok akhirnya menutup fail, sama ada ia ditemui atau tidak, untuk membebaskan sumber.

melontar kata kunci

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.");
                }
            }
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam contoh ini, lontaran secara eksplisit melemparkan IllegalArgumentException jika umurnya negatif, sekali gus menunjukkan ralat logik.

4. Sebarkan Pengecualian

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.");
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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 Tersuai

Java membolehkan anda membuat pengecualian tersuai dengan mewarisi daripada kelas Exception atau RuntimeException. Pengecualian ini berguna untuk melaporkan ralat khusus aplikasi yang tidak diliputi oleh pengecualian standard.

Contoh Pengecualian Tersuai

Andaikan kami mencipta apl perbankan di mana pengguna tidak boleh mengeluarkan lebih banyak wang daripada yang mereka miliki. Kami akan mencipta InsufficientBalanceException.


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();
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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.

Contoh Pengecualian Tersuai untuk Pengesahan Pengguna

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
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.");
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.

6. Amalan Terbaik untuk Pengendalian Pengecualian

6.1 Menggunakan Pengecualian Bermakna

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.");
                }
            }
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.");
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

6.2 Mengelakkan Pengecualian untuk Kawalan Aliran

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();
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penambahbaikan: Gunakan struktur kawalan biasa untuk mengendalikan jenis logik ini.

public class SoldeInsuffisantException extends Exception {
    public SoldeInsuffisantException(String message) {
        super(message);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

6.3 Menggunakan cuba-dengan-sumber untuk Sumber Tertutup

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());
        }
    }
}
Salin selepas log masuk

Penambahbaikan:

public class AgeInvalideException extends Exception {
    public AgeInvalideException(String message) {
        super(message);
    }
}
Salin selepas log masuk

6.4 Jangan tangkap Pengecualian Am

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());
        }
    }
}
Salin selepas log masuk

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
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

6.5 Pengelogan Pengecualian

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.");
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.");
                }
            }
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

7. Konsep Lanjutan

7.1 Pengecualian dalam Persekitaran Asynchronous

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.");
        }
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

7.2 Pengecualian Sampul

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();
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam contoh ini, e ialah punca awal dan boleh diambil oleh getCause() untuk kebolehkesanan yang lebih mudah.


8. Pengujian Unit dan Pengendalian Pengecualian

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);
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.

Kesimpulan

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan