JavaRush /Blog Jawa /Random-JV /Pangecualian ing Jawa: nyekel lan nangani

Pangecualian ing Jawa: nyekel lan nangani

Diterbitake ing grup
Hello! Aku sengit kanggo break kanggo sampeyan, nanging bagean ageng saka proyek programmer kang dealing with kasalahan. Lan paling asring - karo dhewe. Mesthi wae, ora ana wong sing ora salah. Lan ora ana program kasebut. Mesthine, sing paling penting nalika nggarap kesalahan yaiku ngerti sababe. Lan bisa uga ana macem-macem alasan ing program kasebut. Ing sawijining wektu, para pangripta Jawa ngadhepi pitakonan: apa sing kudu dilakoni karo kesalahan sing potensial banget ing program kasebut? Nyingkiri wong-wong mau pancen ora nyata. Programer bisa nulis soko sing mokal malah mbayangno :) Iki tegese iku perlu kanggo mbangun menyang basa mekanisme kanggo dealing with kasalahan. Ing tembung liyane, yen sawetara kesalahan wis kedaden ing program, script dibutuhake kanggo karya luwih. Apa persis sing kudu ditindakake program nalika ana kesalahan? Dina iki kita bakal kenal karo mekanisme iki. Lan diarani "Pengecualian " .

Apa pangecualian ing Jawa

Pangecualian yaiku sawetara kahanan sing luar biasa lan ora direncanakake sing kedadeyan sajrone operasi program. Ana akeh conto pangecualian ing Jawa. Contone, sampeyan nulis kode sing maca teks saka file lan nampilake baris pisanan menyang console.
public class Main {

   public static void main(String[] args) throws IOException {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));
       String firstString = reader.readLine();
       System.out.println(firstString);
   }
}
Nanging file kuwi ora ana! Asil saka program bakal pangecualian - FileNotFoundException. Kesimpulan:

Exception in thread "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (Системе не удается найти указанный путь)
Saben pangecualian diwakili dening kelas kapisah ing Jawa. Kabeh kelas pangecualian asale saka "leluhur" umum - kelas induk Throwable. Jeneng kelas pangecualian biasane nggambarake kanthi ringkes alasan kedadeyan kasebut:
  • FileNotFoundException(file ora ditemokake)
  • ArithmeticException(pangecualian nalika nindakake operasi matematika)
  • ArrayIndexOutOfBoundsException(nomer sel array ditemtokake ngluwihi dawa). Contone, yen sampeyan nyoba ngasilake array sel [23] menyang console kanggo array array dawane 10.
Ana meh 400 kelas ing Jawa! Kenapa akeh banget? Sabenere supaya luwih trep kanggo programer bisa nggarap. Bayangake: sampeyan nulis program, lan nalika mlaku, bakal nggawe pengecualian sing katon kaya iki:
Exception in thread "main"
Uh-uh :/ Ora ana sing jelas. Apa jenis kesalahane lan saka ngendi asale ora jelas. Ora ana informasi sing migunani. Nanging thanks kanggo macem-macem kelas, programmer nemu bab utama kanggo awake dhewe - jinis kesalahan lan kemungkinan sabab, kang ana ing jeneng kelas. Sawise kabeh, iku beda banget kanggo ndeleng ing konsol:
Exception in thread "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (Системе не удается найти указанный путь)
Iku langsung dadi cetha apa masalah bisa lan "ing arah kanggo dig" kanggo ngatasi masalah! Pangecualian, kaya conto kelas, minangka obyek.

Catching lan Nangani Pangecualian

Kanggo nggarap pangecualian ing Jawa, ana blok kode khusus: try, catchlan finally. Pangecualian: interception lan pangolahan - 2Kode ing ngendi programmer ngarepake pangecualian kanggo kedadeyan diselehake ing blok try. Iki ora ateges pangecualian kudu kedadeyan ing lokasi iki. Iki tegese bisa kedadeyan ing kana, lan programer ngerti. Jinis kesalahan sing dikarepake ditampa diselehake ing blok catch("nyekel"). Iki uga ing ngendi kabeh kode sing kudu dieksekusi yen ana pangecualian diselehake. Iki contone:
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {

       System.out.println("Error! File not found!");
   }
}
Kesimpulan:

Ошибка! Файл не найден!
Kita sijine kode ing rong blok. Ing blok pisanan, kita ngarepake kesalahan "File ora ditemokake". Iki minangka blok try. Ing kaloro, kita ngandhani program apa sing kudu ditindakake yen ana kesalahan. Menapa malih, ana jinis tartamtu saka kesalahan - FileNotFoundException. Yen kita ngliwati catchkelas istiméwa liyane menyang kurung pemblokiran, iku ora bakal kejiret.
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));
       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (ArithmeticException e) {

       System.out.println("Error! File not found!");
   }
}
Kesimpulan:

Exception in thread "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (Системе не удается найти указанный путь)
Kode ing pemblokiran catchora bisa amarga kita "dikonfigurasi" pemblokiran iki kanggo nyegat ArithmeticException, lan kode ing pemblokiran trymbuwang metu jinis liyane - FileNotFoundException. Kita ora nulis script kanggo FileNotFoundException, supaya program ditampilake ing console informasi sing ditampilake standar kanggo FileNotFoundException. Ing kene sampeyan kudu nggatekake 3 perkara. Pisanan. Sanalika ana pangecualian ing sembarang baris kode ing blok nyoba, kode sawise iku ora bakal kaleksanan maneh. Eksekusi program bakal langsung "mlumpat" menyang blok catch. Tuladhane:
public static void main(String[] args) {
   try {
       System.out.println("Divide a number by zero");
       System.out.println(366/0);//this line of code will throw an exception

       System.out.println("This");
       System.out.println("code");
       System.out.println("Not");
       System.out.println("will");
       System.out.println("done!");

   } catch (ArithmeticException e) {

       System.out.println("The program jumped to the catch block!");
       System.out.println("Error! You can't divide by zero!");
   }
}
Kesimpulan:

Делим число на ноль 
Программа перепрыгнула в блок catch! 
Ошибка! Нельзя делить на ноль! 
Ing blok trying baris kapindho, kita nyoba kanggo dibagi nomer karo 0, kang ngasilaken ing pangecualian ArithmeticException. Sawise iki, baris 6-10 blok tryora bakal dieksekusi maneh. Kaya sing wis dakkandhakake, program kasebut langsung miwiti nglakokake blok kasebut catch. Kapindho. Bisa uga ana sawetara blok catch. Yen kode ing pemblokiran trybisa uncalan ora siji, nanging sawetara jinis pangecualian, sampeyan bisa nulis pemblokiran dhewe kanggo saben wong catch.
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       System.out.println(366/0);
       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {

       System.out.println("Error! File not found!");

   } catch (ArithmeticException e) {

       System.out.println("Error! Division by 0!");

   }
}
Ing conto iki kita nulis rong blok catch. Yen , tryana ing blok FileNotFoundException, blok pisanan bakal dieksekusi catch. Yen kedadeyan ArithmeticException, sing nomer loro bakal dieksekusi. Sampeyan bisa nulis paling sethithik blok 50. catchNanging, mesthine, luwih becik ora nulis kode sing bisa mbuwang 50 macem-macem kesalahan :) Katelu. Kepiye sampeyan ngerti apa pengecualian kode sing bisa dibuwang? Inggih, sampeyan bisa, mesthi, guess bab sawetara, nanging iku mokal kanggo nyimpen kabeh ing sirah. Mulane, compiler Jawa ngerti babagan pangecualian sing paling umum lan ngerti kahanan apa sing bisa kedadeyan. Contone, yen sampeyan nulis kode lan compiler ngerti yen 2 jinis pengecualian bisa kedadeyan sajrone operasi, kode sampeyan ora bakal dikompilasi nganti sampeyan nangani. Kita bakal weruh conto ing ngisor iki. Saiki babagan penanganan pengecualian. Ana 2 cara kanggo ngolah. Kita wis ketemu sing pisanan - cara kasebut bisa nangani pangecualian kanthi mandiri ing blok kasebut catch(). Ana pilihan kapindho - cara bisa uncalan pangecualian munggah tumpukan telpon. Iki artine apa? Contone, ing kelas kita duwe metode - sing padha printFirstString()- sing maca file lan nampilake baris pisanan menyang console:
public static void printFirstString(String filePath) {

   BufferedReader reader = new BufferedReader(new FileReader(filePath));
   String firstString = reader.readLine();
   System.out.println(firstString);
}
Saiki kode kita ora dikompilasi amarga nduweni pangecualian sing ora ditangani. Ing baris 1 sampeyan nuduhake path menyang file. Compiler ngerti sing kode kuwi bisa gampang mimpin kanggo FileNotFoundException. Ing baris 3 sampeyan maca teks saka file. IOExceptionIng proses iki , kesalahan nalika input-output (Input-Output) bisa gampang kedadeyan . Saiki kompiler ngandhani sampeyan, "Bu, aku ora bakal nyetujoni kode iki utawa nglumpukake nganti sampeyan ngandhani apa sing kudu daklakoni yen ana salah sawijining pengecualian kasebut. Lan mesthi bisa kedadeyan adhedhasar kode sing sampeyan tulis!" . Ora ana ngendi wae, sampeyan kudu ngolah loro-lorone! Opsi pangolahan pisanan wis akrab karo kita: kita kudu nyelehake kode ing blok trylan nambah rong blok catch:
public static void printFirstString(String filePath) {

   try {
       BufferedReader reader = new BufferedReader(new FileReader(filePath));
       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {
       System.out.println("Error, file not found!");
       e.printStackTrace();
   } catch (IOException e) {
       System.out.println("Error while inputting/outputting data from file!");
       e.printStackTrace();
   }
}
Nanging iki ora mung pilihan. Kita bisa supaya nulis script kanggo kesalahan ing cara, lan mung uncalan pangecualian menyang ndhuwur. Iki ditindakake kanthi nggunakake tembung kunci throws, sing ditulis ing deklarasi metode:
public static void printFirstString(String filePath) throws FileNotFoundException, IOException {
   BufferedReader reader = new BufferedReader(new FileReader(filePath));
   String firstString = reader.readLine();
   System.out.println(firstString);
}
Sawise tembung, throwskita dhaptar, dipisahake karo koma, kabeh jinis pangecualian sing cara iki bisa dibuwang sajrone operasi. Yagene iki ditindakake? Saiki, yen ana wong ing program kasebut pengin nelpon metode kasebut printFirstString(), dheweke kudu ngetrapake pangecualian nangani awake dhewe. Contone, ing bagean liya saka program kasebut, salah sawijining rekan sampeyan nulis metode sing diarani metode sampeyan printFirstString():
public static void yourColleagueMethod() {

   //...your colleague's method does something

   //...and at one moment calls your printFirstString() method with the file it needs
   printFirstString("C:\\Users\\Eugene\\Desktop\\testFile.txt");
}
Kesalahan, kode ora kompilasi! printFirstString()Kita ora nulis skrip penanganan kesalahan ing metode kasebut . Mulane, tugas kasebut ana ing pundhak wong-wong sing bakal nggunakake metode iki. Tegese, cara yourColleagueMethod()saiki ngadhepi 2 opsi sing padha: kudu ngolah loro pangecualian sing "teka" nggunakake try-catch, utawa nerusake luwih lanjut.
public static void yourColleagueMethod() throws FileNotFoundException, IOException {
   //...the method does something

   //...and at one moment calls your printFirstString() method with the file it needs
   printFirstString("C:\\Users\\Eugene\\Desktop\\testFile.txt");
}
Ing kasus kapindho, pangolahan bakal tiba ing pundhak saka cara sabanjure ing tumpukan - sing bakal nelpon yourColleagueMethod(). Mulane mekanisme kasebut diarani "mbuwang pengecualian munggah", utawa "liwat menyang ndhuwur". Nalika sampeyan mbuwang pangecualian nggunakake throws, kode kompilasi. Ing wayahe, kompiler kayane ujar: "Oke, oke. Kode sampeyan ngemot akeh pangecualian potensial, nanging aku bakal ngumpulake. Kita bakal bali menyang obrolan iki!" Lan yen sampeyan nelpon cara ing endi wae ing program sing durung nangani pangecualian, compiler nepaki janji lan ngelingake sampeyan maneh. Pungkasan, kita bakal ngomong babagan pemblokiran finally(pardon the pun). Iki minangka bagéan pungkasan saka pangecualian nangani triumvirat try-catch-finally. Keanehane yaiku dieksekusi ing skenario operasi program apa wae.
public static void main(String[] args) throws IOException {
   try {
       BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {
       System.out.println("Error! File not found!");
       e.printStackTrace();
   } finally {
       System.out.println("And here is the finally block!");
   }
}
Ing conto iki, kode nang blok finallydieksekusi ing loro kasus. Yen kode ing pemblokiran trywis kaleksanan tanggung lan ora uncalan pangecualian, pemblokiran bakal murub ing mburi finally. Yen kode ing njero trydiselani lan program mlumpat menyang blok catch, sawise kode ing njero dieksekusi catch, blok kasebut isih bakal dipilih finally. Kenapa perlu? Tujuan utamane yaiku kanggo nglakokake bagean kode sing dibutuhake; bagean sing kudu rampung preduli saka kahanan. Contone, asring mbebasake sawetara sumber daya sing digunakake dening program kasebut. Ing kode, kita mbukak stream kanggo maca informasi saka file lan ngirim menyang file BufferedReader. Kita readerkudu ditutup lan sumber daya dibebasake. Iki kudu ditindakake ing kasus apa wae: ora preduli manawa program kasebut bisa ditindakake utawa mbuwang pengecualian. Iku trep kanggo nindakake iki ing blok finally:
public static void main(String[] args) throws IOException {

   BufferedReader reader = null;
   try {
       reader = new BufferedReader(new FileReader("C:\\Users\\Username\\Desktop\\test.txt"));

       String firstString = reader.readLine();
       System.out.println(firstString);
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } finally {
       System.out.println("And here is the finally block!");
       if (reader != null) {
           reader.close();
       }
   }
}
Saiki kita pancen yakin manawa kita wis ngurus sumber daya sing dikuwasani, preduli saka apa sing kedadeyan nalika program kasebut mlaku :) Ora mung sampeyan kudu ngerti babagan pengecualian. Penanganan kesalahan minangka topik sing penting banget ing pemrograman: luwih saka siji artikel dikhususake. Ing pawulangan sabanjure kita bakal sinau apa jinis pangecualian ana lan carane nggawe pangecualian dhewe :) Sampai jumpa!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION