CodeGym /Blog Jawa /Acak /Pangecualian: nyekel lan nangani
John Squirrels
tingkat
San Francisco

Pangecualian: nyekel lan nangani

Diterbitake ing grup
Hi! Aku sengit kanggo sebutno iku, nanging bagean ageng saka karya programmer kang dealing with kasalahan. Paling asring, dheweke dhewe. Pranyata ora ana wong sing ora luput. Lan ora ana program kasebut. Pangecualian: nyekel lan nangani - 1 Mesthine, nalika ngatasi kesalahan, sing utama yaiku ngerti sababe. Lan akeh perkara sing bisa nyebabake bug ing program. Ing sawetara titik, pangripta Jawa takon dhewe apa sing kudu ditindakake kanthi kesalahan pemrograman sing paling mungkin? Nyingkiri kabeh iku ora nyata, programer bisa nulis barang sing ora bisa dibayangake. :) Dadi, kita kudu menehi basa mekanisme kanggo nggarap kesalahan. Ing tembung liya, yen ana kesalahan ing program sampeyan, sampeyan butuh sawetara skrip kanggo apa sing kudu ditindakake sabanjure. Apa sing kudu ditindakake program nalika ana kesalahan? Dina iki kita bakal kenal karo mekanisme iki. Iki diarani " pangecualian ing Jawa ".

Apa pangecualian?

Pangecualian minangka kahanan sing luar biasa lan ora direncanakake nalika program lagi mlaku. Ana akeh pangecualian. Contone, sampeyan nulis kode sing maca teks saka file, lan nampilake baris pisanan.

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 kepiye yen ora ana file kasebut! Program bakal ngasilake pangecualian: FileNotFoundException. Output: Pangecualian ing thread "utama" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (Sistem ora bisa nemokake path kasebut) Ing Jawa, saben pangecualian dituduhake dening kelas kapisah. Kabeh kelas pangecualian kasebut asale saka "leluhur" umum - Throwablekelas induk. Jeneng kelas pangecualian biasane kanthi ringkes nggambarake kenapa pengecualian kasebut kedadeyan:
  • FileNotFoundException(file ora ditemokake)

  • ArithmeticException(ana pangecualian nalika nindakake operasi matematika)

  • ArrayIndexOutOfBoundsException(indeks ngluwihi wates array). Contone, pangecualian iki kedadeyan yen sampeyan nyoba nampilake posisi 23 saka array sing mung nduweni 10 unsur.
Ing kabeh, Jawa wis meh 400 kelas kuwi! Kenapa akeh banget? Kanggo nggawe luwih trep kanggo programer bisa digunakake. Bayangake iki: sampeyan nulis program, lan nalika lagi mlaku, bakal nggawe pengecualian sing katon kaya iki:

Exception in thread "main"
Uhhhh. :/ Sing ora mbantu akeh. Ora jelas apa tegese kesalahan utawa saka endi. Ora ana informasi sing migunani ing kene. Nanging macem-macem gedhe saka kelas pangecualian ing Jawa menehi programmer apa sing paling penting: jinis kesalahan lan kemungkinan sabab (ditempelake ing jeneng kelas). Iku cukup liyane kanggo ndeleng

Exception in thread "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (The system cannot find the specified path)
Iku langsung cetha apa masalah bisa lan ngendi kanggo miwiti ngeduk kanggo ngatasi masalah! Pangecualian, kaya conto saka kelas apa wae, minangka obyek.

Keno lan nangani istiméwa

Jawa nduweni blok kode khusus kanggo nggarap pangecualian: try, catchlan finally. Pangecualian: nyekel lan nangani - 2 Kode ngendi programmer pracaya pangecualian bisa kelakon diselehake ing trypemblokiran. Iki ora ateges ana pangecualian ing kene. Iki tegese bisa kedadeyan ing kene, lan programer ngerti kemungkinan kasebut. Jinis kesalahan sing dikarepake bakal kedadeyan diselehake ing catchblok kasebut. Iki uga ngemot kabeh kode sing kudu dieksekusi yen ana pangecualian. 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!");
   }
}
Output: Salah! File ora ditemokake! Kita sijine kode ing rong blok. Ing pamblokiran pisanan, kita ngarep-arep manawa ana kesalahan "File not found". Iki tryblok. Ing kaloro, kita ngandhani program apa sing kudu ditindakake yen ana kesalahan. Lan jinis kesalahan tartamtu: FileNotFoundException. Yen kita sijine kelas pangecualian beda ing kurung pemblokiran catch, banjur FileNotFoundExceptionora 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!");
   }
}
Output: Pengecualian ing thread "utama" java.io.FileNotFoundException: C:\Users\Username\Desktop\test.txt (Sistem ora bisa nemokake path sing ditemtokake) Kode ing catchblok kasebut ora mlaku, amarga kita "dikonfigurasi" pemblokiran iki kanggo nyekel ArithmeticException, lan kode ing trypemblokiran mbuwang jinis beda FileNotFoundException:. Kita ora nulis kode kanggo ditangani FileNotFoundException, mula program kasebut nampilake informasi standar kanggo FileNotFoundException. Ing kene sampeyan kudu menehi perhatian marang telung perkara. Nomer siji. Yen ana pangecualian ing sawetara baris ing tryblok kasebut, kode ing ngisor iki ora bakal dieksekusi. Eksekusi program kasebut langsung "mlumpat" menyang catchblok. Tuladhane:

public static void main(String[] args) {
   try {
       System.out.println("Divide 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("will not");
       System.out.println("be");
       System.out.println("executed!");

   } catch (ArithmeticException e) {

       System.out.println("The program jumped to the catch block!");
       System.out.println("Error! You can't divide by zero!");
   }
}
Output: Dibagi dening nul Program mlumpat menyang blok nyekel! Kesalahan! Sampeyan ora bisa dibagi dening nul! Ing baris kapindho saka tryblok, kita nyoba kanggo dibagi dening 0, asil ing ArithmeticException. Akibate, baris 3-9 blok tryora bakal dieksekusi. Kaya sing wis dingerteni, program kasebut langsung miwiti nglakokake catchblok kasebut. Nomer loro. Bisa uga ana sawetara catchblok. Yen kode ing trypemblokiran bisa uncalan ora siji, nanging sawetara jinis pangecualian, sampeyan bisa nulis pemblokiran catchkanggo saben wong.

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 wis nulis rong catchblok. Yen FileNotFoundExceptionana ing tryblok kasebut, blok pertama catchbakal dieksekusi. Yen ArithmeticExceptionana, blok kapindho bakal dieksekusi. Sampeyan bisa nulis 50 catchblok yen pengin. Mesthine, luwih becik ora nulis kode sing bisa mbuwang 50 macem-macem pengecualian. :) Katelu. Kepiye sampeyan ngerti pengecualian kode sing bisa dibuwang? Inggih, sampeyan bisa uga bisa guess sawetara saka wong-wong mau, nanging iku mokal kanggo sampeyan kanggo nyimpen kabeh ing sirah. Compiler Java mula ngerti pengecualian sing paling umum lan kahanan sing bisa kedadeyan. Contone, yen sampeyan nulis kode sing kompiler ngerti bisa mbuwang rong jinis pengecualian, kode sampeyan ora bakal dikompilasi nganti sampeyan nangani. Kita bakal weruh conto ing ngisor iki. Saiki sawetara tembung babagan penanganan pengecualian. Ana 2 cara kanggo nangani pengecualian. Kita wis nemoni sing pertama: cara kasebut bisa nangani pengecualian kasebut ing catch()blok. Ana pilihan kapindho: cara bisa maneh uncalan istiméwa munggah tumpukan telpon. Apa tegese? Contone, kita duwe kelas kanthi printFirstString()cara sing padha, sing maca file lan nampilake baris pisanan:

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 bisa ditangani. Ing baris 1, sampeyan nemtokake path menyang file. Compiler ngerti yen kode kasebut bisa gampang ngasilake file FileNotFoundException. Ing baris 3, sampeyan maca teks saka file. Proses iki bisa gampang nyebabake IOException(kesalahan input/output). Saiki kompiler ngandika marang sampeyan, "Bu, aku ora bakal nyetujoni kode iki lan aku ora bakal ngumpulake nganti sampeyan ngandhani apa sing kudu dilakoni yen salah siji saka pangecualian kasebut kedadeyan. Lan mesthi bisa kedadeyan adhedhasar kode sing sampeyan tulis. !" Ora ana cara kanggo ngatasi: sampeyan kudu nangani loro-lorone! Kita wis ngerti babagan cara nangani pangecualian pisanan: kita kudu nglebokake kode ing blok trylan nambah rong catchblok:

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("File input/output error!");
       e.printStackTrace();
   }
}
Nanging iki ora mung pilihan. Kita mung bisa mbuwang pengecualian sing luwih dhuwur tinimbang nulis kode penanganan kesalahan ing metode kasebut. Iki ditindakake kanthi nggunakake tembung kunci throwsing 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 kunci throws, kita nuduhake dhaptar sing dipisahake koma saka kabeh jinis pengecualian sing bisa ditindakake kanthi cara kasebut. Kenging punapa? Saiki, yen ana wong sing pengin nelpon printFirstString()metode kasebut ing program kasebut, dheweke (dudu sampeyan) kudu ngetrapake penanganan pengecualian. Contone, umpamane ing papan liya ing program, salah sawijining rekan sampeyan nulis metode sing nyebutake printFirstString()metode sampeyan:

public static void yourColleagueMethod() {

   // Your colleague's method does something

   //...and then calls your printFirstString() method with the file it needs
   printFirstString("C:\\Users\\Henry\\Desktop\\testFile.txt");
}
Kita entuk kesalahan! Kode iki ora bakal kompilasi! Kita ora nulis kode penanganan pangecualian ing printFirstString()metode kasebut. Akibaté, tugas iki saiki ana ing pundhak wong sing nggunakake metode kasebut. Ing tembung liyane, methodWrittenByYourColleague()cara saiki duwe opsi 2 sing padha: kudu nggunakake try-catchblok kanggo nangani loro pengecualian kasebut, utawa mbuwang maneh.

public static void yourColleagueMethod() throws FileNotFoundException, IOException {
   // The method does something

   //...and then calls your printFirstString() method with the file it needs
   printFirstString("C:\\Users\\Henry\\Desktop\\testFile.txt");
}
Ing kasus kapindho, cara sabanjure ing tumpukan telpon - sing nelpon methodWrittenByYourColleague()- kudu nangani pangecualian. Mulane kita nyebut iki "mbuwang utawa ngliwati pengecualian". Yen sampeyan mbuwang pengecualian munggah nggunakake tembung kunci throws, kode sampeyan bakal dikompilasi. Ing titik iki, compiler misale jek ngandika, "Oke, oke. Kode sampeyan ngemot akeh pangecualian potensial, nanging aku bakal ngumpulake. Nanging kita bakal bali menyang obrolan iki!" Lan yen sampeyan nelpon sembarang cara sing wis unhandled pangecualian, compiler nepaki janji lan ngelingake sampeyan bab mau maneh. Pungkasan, kita bakal ngomong babagan finallyblok kasebut (nuwun sewu). Iki minangka bagéan pungkasan saka try-catch-finallypangecualian nangani triumvirat..

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's the finally block!");
   }
}
Ing conto iki, kode ing finallyblok bakal dieksekusi ing loro kasus. Yen kode ing trypemblokiran wis mlaku kanthi lengkap tanpa mbuwang pangecualian, pemblokiran finallybakal mbukak ing pungkasan. Yen kode ing trypamblokiran diselani dening pangecualian lan program mlumpat menyang pemblokiran catch, finallypemblokiran isih bakal mbukak sawise kode ing catchpamblokiran. Yagene iki perlu? Tujuan utamane yaiku kanggo nglakokake kode wajib: kode sing kudu ditindakake tanpa preduli saka kahanan. Contone, asring mbebasake sawetara sumber daya sing digunakake dening program kasebut. Ing kode kita, kita mbukak stream kanggo maca informasi saka file lan pass menyang obyek BufferedReader. Kita kudu nutup pembaca lan ngeculake sumber daya. Iki kudu ditindakake apa wae-nalika program kasebut bisa digunakake, lan nalika mbuwang pengecualian. Blok kasebut finallyminangka papan sing trep kanggo nindakake iki:

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's the finally block!");
       if (reader != null) {
           reader.close();
       }
   }
}
Saiki kita yakin manawa kita bakal ngurus sumber daya, preduli saka apa sing kedadeyan nalika program kasebut mlaku. :) Ora mung sampeyan kudu ngerti babagan pengecualian. Penanganan kesalahan minangka topik sing paling penting ing pemrograman. Akeh artikel sing dikhususake. Ing pawulangan sabanjure, kita bakal ngerti apa jinis pangecualian lan carane nggawe pangecualian sampeyan dhewe. :) Sampek ketemu maneh!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION