JavaRush /Blog Java /Random-MS /Pengecualian di Jawa
Roman
Tahap

Pengecualian di Jawa

Diterbitkan dalam kumpulan
Apabila saya menjumpai topik "Pengecualian," banyak soalan yang timbul yang saya terpaksa mencari jawapan di pelbagai sudut Internet untuk memahami secara terperinci bagaimana semuanya berfungsi. Hasilnya, saya telah menyusun penjelasan saya sendiri, yang mungkin lebih mudah difahami oleh pemula yang baru sahaja mengalami fenomena ini. Pengecualian dalam Java - 1Dalam komputer, gangguan ialah isyarat masuk kepada pemproses bahawa peristiwa sedang berlaku yang memerlukan tindak balas segera. Isyarat sampukan memerlukan pemproses untuk menjeda program yang sedang berjalan supaya ia dapat diteruskan sedikit kemudian, iaitu, komputer mesti mengingati semua maklumat yang berkaitan dengan pelaksanaan program. Gangguan sedemikian adalah sementara, jika tidak membawa maut. Gangguan sedemikian boleh disebabkan sama ada oleh kod program atau oleh beberapa fungsi perkakasan (contohnya, hanya menekan kekunci pada papan kekunci; pemasa, sebagai contoh, untuk mematikan komputer secara automatik). Bilangan Gangguan adalah terhad kepada nombor tertentu, dibina ke dalam pengeluaran pemproses tertentu, iaitu, "saluran" komunikasi khas diperuntukkan untuk ini, membolehkan anda mengakses pemproses memintas semua proses lain. Gangguan juga dijana secara automatik apabila ralat berlaku dalam kod program yang melaksanakan (contohnya, jika pembahagian dengan sifar berlaku). Gangguan sedemikian secara tradisinya dipanggil perangkap atau pengecualian . Dalam kes sedemikian, adalah kebiasaan untuk mengatakan: "Pengecualian telah dilemparkan," iaitu, Pengecualian dicetuskan atau Pengecualian dilemparkan (dilemparkan), iaitu, permintaan untuk Gangguandengan soalan "apa yang perlu dilakukan?" dihantar ke pemproses. Pada masa ini, pemproses berhenti berfungsi, mengingati titik di mana ia berhenti, atau lebih tepatnya kumpulan sel seterusnya, maklumat dari mana ia mesti dilaksanakan. Seluruh rantaian arahan yang dilaksanakan dan TIDAK dilaksanakan diingati. Selepas itu, pemproses membaca arahan dari memori untuk tindakan sekiranya berlaku ralat sedemikian. Selaras dengan arahan ini, ia boleh memasukkan nilai baharu ke dalam kelompok tertentu, menambah beberapa rantai tindakan atau kitaran baharu (contohnya, kitaran pemulangan atau gelung), dan lain-lain, iaitu, bergantung pada ralat, yang diletakkan sebelum ini. arahan bawah dilaksanakan. Sistem komputer itu sendiri mempunyai banyak Gangguan automatik yang terbina di dalamnya, yang dicetuskan selepas tempoh masa tertentu, sebagai contoh, untuk mengawal proses yang berjalan pada komputer atau menjalankan set penggera, mengumpul isyarat luaran yang masuk, dan pelbagai penukar data. Perlu diingat bahawa sebilangan besar Gangguan, atas beberapa sebab, boleh "menggantung" sistem sepenuhnya. Ralat dalam kod program secara automatik akan menyebabkan gangguan dalam pemproses, yang akan cuba diproses mengikut arahan yang ditetapkan. Tetapi tidak semua gangguan direka untuk mengendalikannya, atau ia mungkin menghasilkan prosedur yang tidak sesuai dengan kita, sebagai contoh, ia hanya akan merosakkan aplikasi. Oleh itu, dalam pengaturcaraan, adalah mungkin untuk mengatur gangguan anda sendiri untuk bahagian kod tertentu di mana pengaturcara berpotensi melihat kemungkinan ralat. Dalam kes ini, ralat akan diproses dalam program dan tidak akan menghubungi pemproses untuk arahan pemprosesan. Takrifan blok tersebut disusun dengan mencipta Objek "Pengecualian" . Objek ini dicipta secara automatik dalam blok try-catch. Blok >trydisemak untuk kehadiran ralat dan, jika ada, atur cara pergi ke blok catch, di mana tindakan diambil untuk mencegah atau meratakan ralat. Sebagai contoh, jika kita memasukkan Nombor dari papan kekunci , yang kemudiannya mesti ditambah dan ditolak, kemudian memasukkan Huruf dari papan kekunci akan menjadikannya mustahil untuk menambahnya dengan Nombor (mari kita nyatakan jumlah kedua-dua pembolehubah ini dengan huruf S). Oleh itu, sebagai satu pasukan, trykita mesti menyemak sama ada nombor A, mengandungi Nombor, boleh ditambah kepada nombor B, mengandungi Huruf (iaitu, S = A + B), dan jika ini tidak mungkin, dan ia adalah mustahil, maka pasti langkah mesti diambil supaya Ralat TIDAK berlaku dan Gangguan baru dengan soalan "apa yang perlu dilakukan?" tidak terbang ke pemproses. Jika tiada Pengecualian dalam program, pelaksanaannya akan diganggu oleh pemproses. Sekiranya terdapat Pengecualian, apabila ia "ditangkap" oleh arahan try, kawalan beralih kepada arahan catch, yang boleh menetapkan penyelesaian alternatif, sebagai contoh, kami tidak akan menambah dua nombor ini, tetapi tetapkan 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;
/* rentetan “int r = 1;” tidak dilaksanakan kerana ralat berlaku dan pengalihan atur cara berfungsi terus kepada pengendali pengecualian (catch block*/ Oleh itu, kehadiran Pengecualian adalah peluang untuk menyelesaikan masalah dalam atur cara tanpa membuangnya pada tahap pemproses. Objek "Pengecualian", yang dicipta secara automatik dalam blok tryapabila ralat dikesan, mengandungi nilai jenis ralat. Mari kita panggil "OurException" - untuk kes khusus kami dengan penerangan tentang ralat khusus kami. Pencipta bahasa Java telah mencipta senarai ralat biasa dan pilihan biasa untuk membetulkannya terlebih dahulu, iaitu, dalam java terdapat perpustakaan Pengecualian tertentu , yang boleh kita rujuk untuk mengendalikan ralat yang telah berlaku, supaya untuk tidak menulis kod pemprosesan sendiri dan oleh itu OurException berkemungkinan besar sudah seseorang telah diterangkan, jadi kami hanya perlu mengetahui nama mana satu pengecualian ini untuk dimasukkan ke dalam program kami untuk mengendalikan kod di mana kegagalan mungkin berlaku. Jika kami membuat kesilapan dan memilih Pengecualian yang salah daripada perpustakaan , maka pengendali tidak akan "menangkap" ia, ralat tidak akan mencari penyelesaian dalam program dan permintaan akan dihantar kepada pemproses. Tetapi ada cara untuk malas. Jika kita tidak mengetahui nama pengecualian yang kita perlukan dari perpustakaan, maka kita boleh mengambil yang umum dengan nama " Pengecualian ", seperti dalam contoh yang diterangkan di atas. Pengecualian ini mampu mengendalikan sebarang jenis ralat, tetapi ia tidak mampu memberikan maklumat khusus tentang kejadian yang boleh kami log. Pustaka Pengecualian yang ditulis sebelum ini terdiri daripada Pengecualian yang ditanda dan tidak ditanda . Yang boleh disemak adalah yang boleh diperbetulkan tanpa mengganggu kerja program, iaitu, jika kami cuba membuka fail dalam folder yang tidak wujud, sistem akan memberitahu kami mengenainya, kami boleh menggugurkan fail itu. ke dalam folder yang dikehendaki dan teruskan program. Iaitu, sebenarnya, permintaan untuk Gangguan telah dihantar kepada pemproses , tetapi tanpa soalan: "cari apa yang perlu dilakukan mengenai masalah ini?!?!" Kami menghantar Interrupt, yang kami sendiri mengesan, dengan arahan siap, yang diproses oleh pemproses dan terus melaksanakan program. Tidak ditandai ialah ralat yang tidak boleh diperbetulkan dan program akan ditutup sebelum selesai, iaitu, permintaan Gangguan akan dihantar kepada pemproses, yang dalam apa jua keadaan akan mengganggu pelaksanaan program. Satu-satunya perkara dalam menulis pengecualian sedemikian dalam program ini adalah untuk membolehkan pengguna memahami apa yang berlaku, kerana, setelah mendapat gangguan ini, kami boleh memaparkan mesej maklumat pada skrin, itulah sebabnya program itu ranap. Sebab kedua untuk menangkap gangguan tersebut ialah keupayaan untuk merekodkannya dalam log untuk analisis seterusnya (anda telah digodam, tetapi sekurang-kurangnya anda tahu di mana). Akibat daripada kehadiran perpustakaan tersebut adalah keperluan untuk diingat untuk memasukkannya. (Senarai Pengecualian yang disemak dan tidak ditanda dengan perpustakaan boleh didapati, contohnya, di sini ) Jika kita tidak tahu dengan tepat perpustakaan yang hendak disertakan atau terdapat beberapa pilihan ralat, maka kita boleh catchmenyenaraikan Pengecualian yang diperlukan dalam beberapa. Sistem itu sendiri akan memilih pengendali yang betul jika ia berada dalam senarai. Daripada Pengecualian tertentu, anda boleh menulis " Pengecualian " umum yang boleh mengendalikan sebarang jenis Pengecualian jika ia tidak diproses dalam 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 terdapat blok, tryPengecualian dibuat secara automatik. Jika kita perlu memaksa Pengecualian pada satu masa tertentu , maka arahan itu digunakan throw. Iaitu, kami secara bebas mencipta objek new throw... selepas itu, program menghentikan kerjanya, menghantar permintaan Interrupt kepada pemproses dan dipindahkan ke bahagian program catch, dari mana ia cuba mendapatkan arahan untuk tindakan selanjutnya. Dengan mencipta Exception secara manual , kami boleh menentukan jenis khususnya daripada perpustakaan:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
maka pengendali akan mencari blok catchdengan Pengecualian khusus ini - cari sepanjang program, pada semua sisi catch. Selepas throwperintah pengendalian Pengecualian, semua kod program yang tinggal TIDAK akan dilaksanakan, kecuali yang ada dalam blok catch. Jika pengendali tidak ditemui dalam program, pemproses ditanya soalan: "tentukan sendiri apa yang perlu dilakukan" dan ia mengganggu program. Panggilan new throw... boleh dibuat di dalam >trydan di luar blok (di mana-mana sahaja 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

Kaedah yang ditulis oleh seseorang sebelum ini mungkin termasuk membuang Pengecualian. Hanya untuk berada di bahagian yang selamat, pengaturcara yang menulis kod memberi amaran kepada pengaturcara seterusnya bahawa ralat mungkin berlaku dalam kaedah yang ditulisnya. Jadi, sebagai contoh, kaedah penciptaan fail yang diterangkan di bawah menetapkan bahawa apabila mencipta fail ralat mungkin berlaku (tiada fail pada laluan yang diberikan), yang bermaksud bahawa pengendali ralat akan diperlukan:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Tetapi pada masa yang sama, tidak ada pengendali itu sendiri, yang bermaksud bahawa sekarang kami tidak akan dapat memanggil kaedah bertulis dalam program kami dalam mod biasa. Sekarang kita mesti menulis pengendali ralat dan memanggil kaedah ini dalam 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

Anda boleh menulis pengecualian anda sendiri untuk mengendalikan ralat tertentu jika perpustakaan sedia ada tidak mencukupi untuk kami. Untuk melakukan ini, kami hanya mencipta kelas yang mewarisi daripada kelas Pengecualian
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Terdapat dua peraturan yang perlu diingat semasa membuat pengecualian anda sendiri:
  1. Nama kelas kami mesti berakhir dengan "Pengecualian"
  2. Kelas mesti mengandungi pembina dengan pembolehubah rentetan yang menerangkan butiran masalah Pengecualian. Dalam pembina, pembina super dipanggil dan mesej dihantar.
Contoh menggunakan pengecualian yang dijana:
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 kod:
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 daripada melaksanakan program ialah: StudentNotFoundException: Tidak dapat mencari pelajar dengan ID 0000001

Mengapa anda perlu menulis Pengecualian?

Pada tahun 1996, roket Ariane 5 terhempas kerana penukaran pembolehubah apungan yang salah kepada pembolehubah integer. Tiada pengecualian atau pengendali untuk situasi ini. Jika semasa memuat turun fail terdapat kehilangan sambungan ke Internet, maka kehadiran Pengecualian akan membolehkan anda meneruskan memuat turun selepas sambungan dipulihkan. Jika tiada Pengecualian, muat turun perlu dimulakan semula.

Rujukan:

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