JavaRush /Blog Java /Random-MS /Pengecualian dan pengendaliannya
articles
Tahap

Pengecualian dan pengendaliannya

Diterbitkan dalam kumpulan
Pengecualian atau situasi luar biasa (keadaan) adalah ralat yang berlaku dalam atur cara semasa operasinya. Semua pengecualian dalam Java adalah objek. Oleh itu, ia boleh dijana bukan sahaja secara automatik apabila situasi luar biasa berlaku, tetapi juga dicipta oleh pemaju sendiri. Hierarki kelas pengecualian: Pengecualian dan pengendaliannya - 1Pengecualian dibahagikan kepada beberapa kelas, tetapi semuanya mempunyai nenek moyang yang sama - kelas Throwable. Keturunannya ialah subkelas Exceptiondan Error. Pengecualian ( Exceptions) adalah hasil daripada masalah dalam program yang, pada dasarnya, boleh diselesaikan dan boleh diramal. Sebagai contoh, pembahagian dengan sifar berlaku dalam integer. Ralat ( Errors) adalah masalah yang lebih serius yang dinyatakan oleh spesifikasi Java bahawa anda tidak harus cuba mengendalikan dalam program anda sendiri kerana ia adalah masalah peringkat JVM. Sebagai contoh, pengecualian seperti ini berlaku jika memori yang tersedia untuk mesin maya telah kehabisan. Program ini masih tidak akan dapat menyediakan memori tambahan untuk JVM. Di Jawa, semua pengecualian dibahagikan kepada tiga jenis: pengecualian yang ditanda ( checked) dan pengecualian yang tidak ditanda ( unchecked) yang merangkumi ralat ( Errors) dan pengecualian masa jalan ( RuntimeExceptionsturunan kelas Exception). Pengecualian terkawal ialah ralat yang boleh dan harus dikendalikan dalam atur cara; semua keturunan kelas Exception(tetapi bukan RuntimeException) tergolong dalam jenis ini. Pengendalian pengecualian boleh dilakukan menggunakan operator try…catchatau dipindahkan ke bahagian luar program. Sebagai contoh, kaedah boleh lulus pengecualian yang berlaku di dalamnya lebih tinggi dalam hierarki panggilan tanpa mengendalikannya sendiri. Pengecualian yang tidak ditandai tidak memerlukan pengendalian, tetapi anda boleh mengendalikan pengecualian kelas jika anda mahu RuntimeException. Mari kita susun dan jalankan program berikut:
class Main {
     public static void main(String[] args) {
         int a = 4;
         System.out.println(a/0);
     }
}
Apabila dilancarkan, mesej berikut akan dipaparkan pada konsol:
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)
Mesej menunjukkan kelas pengecualian yang berlaku - ArithmeticException. Pengecualian ini boleh dikendalikan:
class Main {
     public static void main(String[] args) {
         int a = 4;
         try {
              System.out.println(a/0);
         } catch (ArithmeticException e) {
              System.out.println("Произошла недопустимая арифметическая операция");
         }
     }
}
Sekarang, bukannya mesej ralat standard, blok akan dilaksanakan catch, parameternya ialah objek e kelas yang sepadan dengan pengecualian (objek itu sendiri boleh diberi nama apa pun, ia akan diperlukan jika kita mahu membuang secara paksa pengecualian ini sekali lagi, sebagai contoh, supaya ia diperiksa beberapa pengendali lain). Dalam kes ini, blok trymengandungi serpihan program di mana pengecualian berpotensi berlaku. Seseorang tryboleh sepadan dengan beberapa blok tangkapan dengan kelas pengecualian yang berbeza.
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
     int[] m = {-1,0,1};
        Scanner sc = new Scanner(System.in);
        try {
            int a = sc.nextInt();
            m[a] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        }
    }
}
Jika, selepas melancarkan program yang dibentangkan, pengguna masuk dari papan kekunci 1 atau 2, program akan berjalan tanpa membuat sebarang pengecualian. Jika pengguna memasukkan 0, pengecualian kelas akan berlaku ArithmeticExceptiondan akan dikendalikan oleh blok pertama catch. Jika pengguna memasukkan 3, pengecualian kelas akan berlaku ArrayIndexOutOfBoundsException(tatasusunan di luar sempadan), dan ia akan diproses oleh blok kedua catch. Jika pengguna memasukkan nombor bukan integer, contohnya, 3.14, maka pengecualian kelas akan berlaku InputMismatchException(ketakpadanan jenis input), dan ia akan dilemparkan dalam format ralat standard, kerana kami tidak mengendalikannya dalam apa jua cara. Walau bagaimanapun, anda boleh menambah pengendali untuk class Exception, memandangkan kelas ini ialah kelas induk untuk semua pengecualian lain yang diperiksa, ia akan menangkap mana-mana daripadanya (termasuk InputMismatchException).
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        int[] m = {-1,0,1};
        int a = 1;
        Scanner sc = new Scanner(System.in);
        try {
            a = sc.nextInt();
            m[a-1] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        } catch (Exception e) {
            System.out.println("Произошло ещё Howое-то исключение");
        }
    }
}
Memandangkan pengecualian dibina di atas hierarki kelas dan subkelas, anda harus terlebih dahulu cuba mengendalikan pengecualian yang lebih khusus dan kemudian yang lebih umum. Iaitu, jika kami meletakkan blok pertama (dan bukan yang ketiga) dengan pengendalian pengecualian kelas Exception, kami tidak akan melihat sebarang mesej ralat selain daripada "Sesetengah pengecualian lain telah berlaku" (semua pengecualian akan ditangkap serta-merta oleh blok ini dan tidak akan mencapai selebihnya). Tambahan pilihan pada blok try…catchboleh menjadi blok finally. Arahan yang diletakkan di dalamnya akan dilaksanakan dalam apa jua keadaan, tidak kira sama ada pengecualian berlaku atau tidak. Walaupun fakta bahawa apabila pengecualian yang tidak dikendalikan berlaku, bahagian program yang tinggal selepas penjanaan pengecualian ini tidak dilaksanakan. Sebagai contoh, jika pengecualian berlaku semasa beberapa pengiraan yang panjang, finallyanda boleh menunjukkan atau menyimpan hasil perantaraan dalam blok. Pautan ke sumber: Pengecualian dan pengendaliannya
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION