Pure Java – 47 Handling Exception – 01
Merhaba arkadaslar,
Bu bolumden itibaren Java da Exception mekanizmasini incelemeye baslayacagiz. OCP 6 notlari olmasina ragmen Java 7 ile birlikte gelen ozelligi de inceleyecegiz.
Error/hatayi bulma ve handle/yonetme islemi robust/guclu uygulamalar icin cok onemli bir konudur. Exception, ortaya cikan istisnai durumdur. Turkce karsilik olarak istisna olarak da adlandirilir. Exception/hata/error kodun bir kisminda ortaya cikan/cikabilen exceptional condition yani istisnai durumdur. Java da kavram olarak Exception ve Error farkli anlama gelmektedir. Ilerleyen yazilarda inceleyecegiz.
Java da exception mekanizmasi icin su anahtar kelimeler kullanilir;
try , catch , throw , throws , finally.
try – catch
try , exceptionlara karsi korunmak ve onlari yonetmek icin,izlemek istedigimiz kodu, bir try blogu icine aliriz. try blogunun anlami “caution/dikkat” hata cikabilir.
try ve catch beraber calisir ortaklasa calisir. catch cumleciginin kapsami oncesinde gelen try cumlecigindeki ifadelerle sinirlidir. try veya catch i tek basina kullanamayiz.
Genel format ;
try { } catch (FirstException ex) { } catch (SecondException ex) { } catch(ThirdException ex) { }
Ilk olarak basit bir ornek yapalim;
Test1.java
package purejava47; public class Test1 { public static void main(String[] args) { int a = 10; int b = 0; try { System.out.println(a / b); System.out.println("Bu kisim calismayacak."); } catch (ArithmeticException ex) { System.out.println("0 a bolme hatasi."); System.out.println(ex); } System.out.println("catch blogundan sonra"); } }
try blogu icerisinde a/b islemi ArithmeticException ‘ a neden olacaktir. Dikkat ederseniz bundan sonra try blogu calismaya devam etmeyecektir catch blogu calismaya devam edecektir.
catch cumleciginin amaci , exceptionlari cozumlemek ve hic hata olmamis gibi programin devam etmesini saglamaktir.
Giriste temel formatta belirtigim gibi , birden fazla catch kullanabiliriz.
Test2.java
import java.io.*; public class Test2 { public void readFromFile(String fileName) { try { FileReader fis = new FileReader(fileName); System.out.println(fileName + " dosya bulundu"); char data = (char) fis.read(); System.out.println("read: " + data); } catch (FileNotFoundException e) { System.out.println("Doysya bulunamadi. " + e.getMessage()); } catch (IOException e) { System.out.println("IOException meydana geldi."); e.printStackTrace(); } System.out.println("catch sonrasi"); } public static void main(String[] args) { Test2 reader = new Test2(); reader.readFromFile("mydata.txt"); System.out.println("main sonu"); } }
Sonraki yazilarda farkli acilardan tekrar try-catch’e deginecegim. Simdilik finally ile devam edelim.
finally
try-catch mekanizmasini handling exception / hatalari yonetmek icin kullaniyoruz. Dusunelim, bir metotta dosya okuma islemi yapiyoruz ya da veritabanina baglanti yapiyoruz bir sorun olsa bile dosyanin veya veritabani baglantisinin kapatilmasini isteriz. Bu durumda kapatma kodunu hem normal kod akisi icerisinde hem de catch icerisinde koymamiz gerekir, bunun yerine finally anahtar kelimesini kullanarak bu sorunu cozeriz.
finally, try/catch blogundan sonra kullanilabilir ya da catch olmadan try ile birlikte kullanilabilir fakat tek basina kullanilamaz. finally den sonra da catch kullanilamaz.
try { } catch(MyFirstException) { } catch(MySecondException) { } finally { }
finally blogu bir exception/hata firlatilsa da firlatilmasada ilgili catchte yakalansa da yakalanmasada(yani farkli turkde bir exception olabilir) calisacaktir. finally her zaman calisir kurali gecerlidir, tabi bir kac istisnasi mevcuttur. Bunlardan bahsedecegim.
Sinavda try-catch-finally yapisina dikkat etmek gerekli. Hangi durumlarda derleme hatasi verecegini bilmek onemli.
// try-finally birlikte kullanilabilir. try { // do stuff } finally { //clean up } //finally , catchten sonra olamaz. Derleme hatasi try { // do stuff } catch (SomeException ex) { // do exception handling } finally { // clean up } //try tek basina kullanilamaz try { // do stuff } // catch veya finally gerekli System.out.println("out of try block"); // derleme hatasi, try ile catch arasinda kod olamaz. try { // do stuff } System.out.print("below the try"); catch(Exception ex) { }
Test3.java
package purejava47; public class Test3 { public static void main(String[] args) { System.out.println("#####test 1#####"); try { System.out.println("try 1"); throw new NullPointerException(); } catch (NullPointerException e) { System.out.println("catch 1"); } finally { System.out.println("finally 1"); } System.out.println("#####test 2#####"); try { System.out.println("try 2"); } catch (NullPointerException e) { System.out.println("catch 2"); // bu kisim calismayacak } finally { System.out.println("finally 2"); // finally catch calissa da // calismasa da calisacaktir. } System.out.println("#####test 3#####"); try { System.out.println("try 3"); System.out.println(10 / 0); } catch (NullPointerException e) { } finally { System.out.println("finally 3"); // 10/0 islemi ArihtmeticException // a neden olur, dolayisiyla // catchte yakalamaz. } } }
Aciklamalari kod uzerinde yapmayacalistim. Simdi de su ornege bakalim ;
Test4.java
package purejava47; public class Test4 { private int getValue() { int value = 5; try { value = 20 / 0; return value; } catch (Exception e) { value = 10; System.out.println("catch"); return value; // exception yakalanacaktir return olmasina ragmen finally calisacaktir. } finally { value = 50; System.out.println("finally"); return value; //finally blogu calistigi icin en son olarak 50 degerini dondurecektir. } } public static void main(String[] args) { Test4 test = new Test4(); System.out.println(test.getValue()); } }
finally blogunun calismayacagi bir kac durum mevcuttur. Bunlarin bir tanesi exit() metodunun kullanimidir.
Test5.java
package purejava47; public class Test5 { public static void main(String[] args) { try { System.out.println("try"); System.exit(0); }finally{ System.out.println("calismayacak"); } System.out.println("calismayacak - 2"); } }
Bu bolumde try, catch ve finally anahtar kelimelerinin inceledik. Bu ilk bolumde Java da exception mekanizmasina hizli bir goz attik. Bu konudaki bilginize gore bol miktar ornek kod yazmaniz faydali olur.
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
injavawetrust
Leave a Reply