JavaRush /Java Blog /Random-ID /Pengecualian di Jawa
Roman
Level 33

Pengecualian di Jawa

Dipublikasikan di grup Random-ID
Ketika saya menemukan topik “Pengecualian”, banyak pertanyaan muncul yang harus saya cari jawabannya di berbagai penjuru Internet untuk memahami secara detail cara kerjanya. Oleh karena itu, saya telah menyusun penjelasan saya sendiri, yang mungkin lebih mudah dipahami oleh pemula yang baru saja menjumpai fenomena ini. Pengecualian di Jawa - 1Di komputer, interupsi adalah sinyal masuk ke prosesor bahwa suatu peristiwa sedang terjadi yang memerlukan respons segera. Sinyal interupsi mengharuskan prosesor untuk menghentikan sementara program yang sedang berjalan agar dapat dilanjutkan nanti, yaitu komputer harus mengingat semua informasi yang terkait dengan pelaksanaan program. Gangguan seperti ini bersifat sementara, bahkan tidak berakibat fatal. Gangguan tersebut dapat disebabkan oleh kode program atau fungsi perangkat keras tertentu (misalnya, sekadar menekan tombol pada keyboard; pengatur waktu, misalnya, untuk mematikan komputer secara otomatis). Jumlah Interupsi dibatasi pada jumlah tertentu, dibangun ke dalam produksi prosesor tertentu, yaitu, “saluran” komunikasi khusus dialokasikan untuk ini, memungkinkan Anda mengakses prosesor melewati semua proses lainnya. Interupsi juga dihasilkan secara otomatis ketika terjadi kesalahan pada kode program yang dijalankan (misalnya, jika terjadi pembagian dengan nol). Interupsi seperti ini secara tradisional disebut jebakan atau pengecualian . Dalam kasus seperti itu, biasanya dikatakan: "Pengecualian telah dilempar", yaitu, Pengecualian telah dipicu atau Pengecualian telah dilempar (dilempar), yaitu permintaan untuk Interupsidengan pertanyaan “apa yang harus dilakukan?” dikirim ke prosesor. Pada saat ini, prosesor berhenti bekerja, mengingat titik di mana ia berhenti, atau lebih tepatnya kumpulan sel berikutnya, yang informasinya harus dieksekusi. Seluruh rangkaian instruksi yang dieksekusi dan TIDAK dieksekusi akan diingat. Setelah itu, prosesor membaca instruksi dari memori untuk tindakan jika terjadi kesalahan seperti itu. Sesuai dengan instruksi ini, ia dapat memasukkan nilai-nilai baru ke dalam cluster tertentu, menambahkan beberapa rangkaian tindakan atau siklus baru (misalnya, siklus pengembalian atau perulangan), dll., tergantung pada kesalahan yang dibuat sebelumnya. instruksi turun dijalankan. Sistem komputer itu sendiri memiliki banyak Interupsi otomatis yang terpasang di dalamnya, yang dipicu setelah jangka waktu tertentu, misalnya, untuk mengontrol proses yang berjalan di komputer atau menjalankan alarm yang disetel, mengumpulkan sinyal eksternal yang masuk, dan berbagai konverter data. Perlu diingat bahwa sejumlah besar Interupsi, karena sejumlah alasan, dapat sepenuhnya “menggantung” sistem. Kesalahan pada kode program secara otomatis akan menyebabkan gangguan pada prosesor, yang akan dicoba diproses sesuai dengan instruksi yang ditetapkan. Namun tidak semua interupsi dirancang untuk menanganinya, atau mungkin menghasilkan prosedur yang tidak sesuai dengan kita, misalnya, aplikasi hanya akan crash. Oleh karena itu, dalam pemrograman, dimungkinkan untuk mengatur interupsinya sendiri untuk bagian kode tertentu di mana pemrogram berpotensi melihat kemungkinan kesalahan. Dalam hal ini, kesalahan akan diproses dalam program dan tidak akan menghubungi prosesor untuk meminta instruksi pemrosesan. Definisi blok tersebut diatur dengan membuat Objek “Pengecualian” . Objek ini secara otomatis dibuat di blok try-catch. Blok >trydiperiksa apakah ada kesalahan dan, jika ada, program menuju ke blok tersebut catch, di mana tindakan diambil untuk mencegah atau meratakan kesalahan. Misalnya, jika kita memasukkan Angka dari keyboard , yang selanjutnya harus dijumlahkan dan dikurangkan, maka memasukkan Huruf dari keyboard akan membuat tidak mungkin untuk menjumlahkannya dengan Angka (mari kita nyatakan jumlah kedua variabel ini dengan huruf S). Oleh karena itu, sebagai sebuah tim, trykita harus memeriksa apakah angka A yang berisi Angka dapat dijumlahkan dengan angka B yang berisi Huruf (yaitu S = A + B), dan jika tidak memungkinkan, dan tidak mungkin, maka pasti tindakan harus diambil agar Kesalahan TIDAK terjadi dan Interupsi baru dengan pertanyaan “apa yang harus dilakukan?” tidak terbang ke prosesor. Jika tidak ada Pengecualian dalam program, eksekusinya akan terganggu oleh prosesor. Jika ada Pengecualian, ketika "tertangkap" oleh perintah try, kontrol diteruskan ke perintah catch, yang dapat mengatur solusi alternatif, misalnya kita tidak akan menjumlahkan kedua angka ini, tetapi menetapkan S = A.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* rangkaian “int r = 1;” tidak dieksekusi karena terjadi kesalahan dan pengalihan program bekerja langsung ke pengendali pengecualian (blok tangkapan*/ Dengan demikian, kehadiran Pengecualian merupakan peluang untuk menyelesaikan masalah di dalam program tanpa melemparkannya ke tingkat prosesor. Objek "Pengecualian", yang secara otomatis dibuat di blok tryketika kesalahan terdeteksi, berisi nilai jenis kesalahan. Sebut saja “OurException” - untuk kasus khusus kami dengan deskripsi kesalahan spesifik kami. Pembuat bahasa Java terlebih dahulu membuat daftar kesalahan umum tertentu dan opsi tipikal untuk memperbaikinya, yaitu, di java terdapat perpustakaan Pengecualian tertentu , yang dapat kita gunakan untuk menangani kesalahan yang telah terjadi, sehingga untuk tidak menulis sendiri kode pemrosesan dan oleh karena itu OurException kemungkinan besar sudah dijelaskan oleh seseorang, jadi kita hanya perlu mengetahui nama pengecualian mana yang akan dimasukkan ke dalam program kita untuk menangani kode yang berpotensi terjadi kegagalan. Jika kita membuat kesalahan dan memilih Pengecualian yang salah dari perpustakaan , maka handler tidak akan “menangkapnya”, kesalahan tersebut tidak akan menemukan solusi dalam program dan permintaan akan dikirim ke prosesor. Tapi ada jalan bagi mereka yang malas. Jika kita tidak mengetahui nama Exception yang kita perlukan dari Library, maka kita bisa mengambil yang umum dengan nama “ Exception ”, seperti pada contoh yang dijelaskan di atas. Pengecualian ini mampu menangani segala jenis kesalahan, namun tidak mampu memberikan informasi spesifik tentang insiden yang dapat kami catat. Pustaka Exceptions yang ditulis sebelumnya terdiri dari Exceptions yang dicentang dan tidak dicentang . Yang dapat diperiksa adalah yang dapat diperbaiki tanpa mengganggu kerja program, yaitu jika kita mencoba membuka file di folder yang tidak ada, sistem akan memberi tahu kita, kita dapat membuang file tersebut. ke dalam folder yang diinginkan dan lanjutkan program. Faktanya, permintaan Interrupt telah dikirim ke prosesor , tetapi tanpa pertanyaan: "cari apa yang harus dilakukan untuk mengatasi masalah ini?!?!" Kami mengirimkan Interupsi, yang kami deteksi sendiri, dengan instruksi siap pakai, yang diproses oleh prosesor dan terus menjalankan program. Yang tidak dicentang adalah kesalahan yang tidak dapat diperbaiki dan program akan ditutup sebelum selesai, yaitu permintaan Interupsi akan dikirim ke prosesor, yang bagaimanapun juga akan mengganggu pelaksanaan program. Satu-satunya tujuan dalam menulis pengecualian tersebut dalam program ini adalah untuk memberi tahu pengguna apa yang terjadi, karena, setelah menangkap gangguan ini, kita dapat menampilkan pesan informasi di layar yang menyebabkan program tersebut mogok. Alasan kedua untuk menangkap gangguan tersebut adalah kemampuan untuk mencatatnya di log untuk analisis selanjutnya (Anda diretas, tapi setidaknya Anda tahu di mana). Konsekuensi dari kehadiran perpustakaan semacam ini adalah perlunya mengingat untuk menyertakannya. (Daftar Pengecualian dengan perpustakaan yang dicentang dan tidak dicentang dapat ditemukan, misalnya, di sini ) Jika kita tidak tahu persis perpustakaan mana yang harus disertakan atau ada beberapa opsi kesalahan, maka kita dapat membuat catchdaftar Pengecualian yang diperlukan dalam beberapa. Sistem itu sendiri akan memilih pengendali yang benar jika ada dalam daftar. Alih-alih Pengecualian tertentu, Anda dapat menulis " Pengecualian " umum yang dapat menangani semua jenis Pengecualian jika tidak diproses di blok sebelumnya.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
Jika ada blok, tryPengecualian dibuat secara otomatis. Jika kita perlu memaksakan Pengecualian pada suatu saat , maka perintah tersebut digunakan throw. Artinya, kita secara mandiri membuat objek new throw... setelah itu, program berhenti bekerja, mengirimkan permintaan Interupsi ke prosesor dan ditransfer ke bagian program catch, dari mana ia mencoba mendapatkan instruksi untuk tindakan lebih lanjut. Dengan membuat Exception secara manual , kita dapat menentukan tipe spesifiknya dari perpustakaan:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
kemudian pawang akan mencari blok catchdengan Pengecualian khusus ini - cari di seluruh program, di semua sisi catch. Setelah throwperintah penanganan Exception, semua kode program yang tersisa TIDAK akan dijalankan, kecuali yang ada di blok catch. Jika pengendali tidak ditemukan dalam program, prosesor akan ditanyai pertanyaan: "putuskan sendiri apa yang harus dilakukan" dan itu akan menghentikan program. Panggilan new throw... dapat dilakukan di dalam >trydan di luar blok (di mana saja dalam program)
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Pemberitahuan Pengecualian

Metode yang sebelumnya ditulis oleh seseorang mungkin termasuk melempar Pengecualian. Untuk berjaga-jaga, programmer yang menulis kode tersebut memperingatkan programmer berikutnya bahwa mungkin ada kesalahan dalam metode yang dia tulis. Jadi, misalnya, metode pembuatan file yang dijelaskan di bawah ini menetapkan bahwa kesalahan mungkin terjadi saat membuat file (tidak ada file di jalur yang diberikan), yang berarti diperlukan penangan kesalahan:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Tetapi pada saat yang sama, tidak ada pengendali itu sendiri, yang berarti bahwa sekarang kita tidak dapat memanggil metode tertulis dalam program kita dalam mode normal. Sekarang kita harus menulis penangan kesalahan dan memanggil metode ini di blok try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Pengecualian asli

Dimungkinkan untuk menulis pengecualian Anda sendiri untuk menangani kesalahan tertentu jika perpustakaan yang ada tidak cukup bagi kami. Untuk melakukan ini, kita cukup membuat kelas yang mewarisi kelas Exception
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Ada dua aturan yang perlu diingat saat membuat pengecualian Anda sendiri:
  1. Nama kelas kita harus diakhiri dengan "Pengecualian"
  2. Kelas harus berisi konstruktor dengan variabel string yang menjelaskan detail masalah Pengecualian. Di konstruktor, konstruktor super dipanggil dan sebuah pesan diteruskan.
Contoh penggunaan pengecualian yang dihasilkan:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Kami menangkap Pengecualian ini dengan kode:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
Hasil eksekusi program adalah: StudentNotFoundException: Tidak dapat menemukan siswa dengan ID 0000001

Mengapa Anda perlu menulis Pengecualian?

Pada tahun 1996, roket Ariane 5 jatuh karena kesalahan konversi variabel float ke variabel integer. Tidak ada pengecualian atau penangan untuk situasi ini. Jika saat mengunduh suatu file terjadi kehilangan koneksi ke Internet, maka keberadaan Pengecualian akan memungkinkan Anda untuk melanjutkan pengunduhan setelah koneksi dipulihkan. Jika tidak ada Pengecualian, pengunduhan harus dimulai lagi.

Referensi:

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION