BİL-141 Bilgisayar Programlama I (Java) Hazırlayan: M.Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü Not: Bu dersin sunumları, “Java Bilgisayar Programlamaya Giriş, A. Yazıcı, E. Doğdu, M. Özbayoğlu, M. Erten, O. Ergin” kitabı kullanılarak hazırlanmıştır. Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu 1 Kural Dışı Durumlar Programlar genellikle girişlerin kullanıcı tarafından uygun gireleceği veya çalışmasının normal şekilde tamamlanacağı varsayılarak yazılır. Java’da program istenmeyen bir durum oluştuğunda durumu dışarıya bildirir. Programcı Java’da bulunan istenmeyen durum çözme araçlarını kullanarak daha hatasız bir program yazabilir. Bu tür araçların kullanımı programı daha anlaşılabilir yapar ve hata denetimini kolaylaştırır. 3 Kural Dışı Durumlar Örnekte iki sayıyı birbirine bölen program verilmiştir. import java.util.Scanner; public class Bolme { public static void main(String [] args) { String yanit; do { System.out.print("Bolunecek sayi:\t"); Scanner klavye = new Scanner(System.in); int a = klavye.nextInt(); System.out.print("Bolen sayi:\t"); int b = klavye.nextInt(); int c = a / b; System.out.println(); System.out.println(a + " / " + b + " = " + c); System.out.println(); System.out.print("Bir daha denemek ister misin? (e/h) "); yanit = klavye.next(); System.out.println(); } while ((yanit.equals("e")) || (yanit.equals("E"))); } } 4 2 Kural Dışı Durumlar Örnekte farklı değerler için bölme sonuçları verilmiştir. Çıktı: Bolunecek sayi: Bolen sayi: 14 6 14 / 6 = 2 Bir daha denemek ister misin? (e/h) h Çıktı: Bolunecek sayi: Bolen sayi: 14 0 Exception in thread “main” java.lang.ArtihmeticException: / by zero at Bolme.main(Bolme.java:13) Press any key to continue... Yukarıdaki mesaj kural dışı bir durumla karşılaşıldığını ve program içinde çözümünün olmadığını bildirir. 5 Kural Dışı Durumlar Örnek: İki sayıyı birbirine bölen programın düzeltilmiş hali. import java.util.Scanner; public class Bolme2 { public static void main(String [] args) { String yanit; do { System.out.print("Bolunecek sayi:\t"); Scanner klavye = new Scanner(System.in); int a = klavye.nextInt(); System.out.print("Bolen sayi:\t"); int b = klavye.nextInt(); if (b == 0) { System.out.println(); System.out.println("Bolen Sifir Olamaz!"); } else { int c = a / b; System.out.println(); System.out.println(a + " / " + b + " = " + c); } 6 3 Kural Dışı Durumlar Örnek: İki sayıyı birbirine bölen programın düzeltilmiş hali - devam System.out.println(); System.out.print("Bir daha denemek ister misin? (e/h) "); yanit = klavye.next(); System.out.println(); } while ((yanit.equals("e")) || (yanit.equals("E"))); } } Çıktı: Bolunecek sayi: Bolen sayi: 14 0 Bolen sifir olamaz! Bir daha denemek ister misin? (e/h) 7 Kural Dışı Durumlar Örnek: Java araçları kullanılarak bölme programın düzeltilmiş hali. import java.util.Scanner; public class Bolme3 { public static void main(String [] args) { String yanit; do { Scanner klavye = new Scanner(System.in); try { System.out.print("Bolunecek sayi:\t"); int a = klavye.nextInt(); System.out.print("Bolen sayi:\t"); int b = klavye.nextInt(); if (b == 0) throw new Exception("Kural Disi Durum: Bolen Sifir!"); int c = a / b; System.out.println(); System.out.println(a + " / " + b + " = " + c); } 8 4 Kural Dışı Durumlar Örnek: Java araçları kullanılarak bölme programın düzeltilmiş hali. catch (Exception ozelDurum) { System.out.println(); System.out.println(ozelDurum.getMessage()); System.out.println("Bolen Sifir Olamaz!"); } System.out.println(); System.out.print("Bir daha denemek ister misin? (e/h) "); yanit = klavye.next(); System.out.println(); } while ((yanit.equals("e")) || (yanit.equals("E"))); } } try bloğu herhangi bir hata ile karşılaşınca catch bloğuna geçilir. catch bloğu içinde Hata türüne uygun mesaj yazıdırılır. 9 Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu 5 try ve catch Blokları ve throw Komutu Java’da istenmeyen durumların çözümünde trythrow-catch üçlüsü kullanılır. try bir kod bloğunun denenmesi için kullanılır. try { Denenecek program } Eğer try bloğunda istenmeyen bir durum oluşursa throw ile dışarıya bildirilir. try { Denenecek program Beklenmeyen durumun bildirilmesi satır (throw) Programın devamı } 11 try ve catch Blokları ve throw Komutu throw new Exception(“kural Dışı durum: Bolen sıfır!”); Java throw komutunu görünce hemen catch bloğunu çağırır. Yukarıdaki satır aşağıdaki gibi de yazılabilir. Exception ozelDurum = new Exception(“kural Dışı durum: Bolen sıfır!”); throw ozelDurum; Catch bloğu hem yakalanacak kural dışı durumu belirler ve blok içinde işlem yapılmasını sağlar. 12 6 Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu Exception Sınıfı Exception sınıf Java’da kural dışı durumların belirlenmesi için kullanılan Java tarafından tanımlanmış bir sınıftır. Exception nesnesi kural dışı durumu ifade eden bilgiyi String olarak alır. Aşağıdaki örnekte throw ile yeni bir Exception nesne kurucusu çalıştırılmıştır. Exception ozelDurum = new Exception(“Kural Disi Durum: Bolen Sifir!”); throw ozelDurum; catch bloğuyla atanmış String ifade getMessage() metoduyla alınmıştır. catch { System.out.println(ozelDurum.getMessage()); System.out.println(“Bolen Sifir olamaz!”) } 14 7 Exception Sınıfı Java’da bazı kural dışı durumlar için tanımlamalar yapılmış durumdadır. Bunlar doğrudan kullanılabilir. ArithmeticException IOException ClassNotFoundException FileNotFoundException Bu tür kural dışı durum yakalandığında getMessage() mesajıyla String ileti alınabilir. ArrayIndexOutOfBoundsException gibi durumlar programda mantık hatasını yansıtır ve try-catch ile yakalanmasına gerek yoktur. 15 Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu 8 Kural Dışı Durum Sınıfı Tanımlama Java’da programcı kendi kural dışı sınıfını Exception sınıfından türetebilir. Yeni kural dışı durum oluştururken kurucular en önemli kısımdır. public class SifiraBolmeHatasi extends Exception { // Parametre almadan çalışır public SifiraBolmeHatasi() { super("Bolen Sifir!"); } // Parametre alarak çalışır public SifiraBolmeHatasi(String ileti) { super(ileti); } } 17 Kural Dışı Durum Sınıfı Tanımlama Örnek - SifiraBolmeHatasi sınıfının kullanımı import java.util.Scanner; public class Bolme4 { public static void main(String [] args) { String yanit; do { Scanner klavye = new Scanner(System.in); try { System.out.print("Bolunecek sayi:\t"); int a = klavye.nextInt(); System.out.print("Bolen sayi:\t"); int b = klavye.nextInt(); if (b == 0) throw new SifiraBolmeHatasi("Bolen Sifir!"); int c = a / b; System.out.println(); System.out.println(a + " / " + b + " = " + c); } 18 9 Kural Dışı Durum Sınıfı Tanımlama Örnek - SifiraBolmeHatasi sınıfının kullanımı - devam catch (SifiraBolmeHatasi ozelDurum) { System.out.println(); System.out.println(ozelDurum.getMessage()); System.out.println("Bolen Sifir Olamaz!"); } System.out.println(); System.out.print("Bir daha denemek ister misin? (e/h) "); yanit = klavye.next(); System.out.println(); } while ((yanit.equals("e")) || (yanit.equals("E"))); } } 19 Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu 10 Bir try Bloğuyla Çok Sayıda catch Kullanımı Java’da bir try bloğuyla birden fazla catch bloğu birlikte kullanılabilir. Java’da istenmeyen durum oluştuğunda uygun ilk catch bloğunu çalıştırır. import java.util.Scanner; public class Bolme5 { public static void main(String [] args) { String yanit; do { Scanner sc = new Scanner(System.in); SifiraBolmeHatasi sifir=new SifiraBolmeHatasi("Bolen Sifir!"); BireBolmeHatasi bir = new BireBolmeHatasi("Bolen Bir!"); EksiBireBolmeHatasi eksiBir=new EksiBireBolmeHatasi("Bolen Eksi Bir!"); try { System.out.print("Bolunecek sayi:\t"); int a = klavye.nextInt(); System.out.print("Bolen sayi:\t"); int b = klavye.nextInt(); 21 Bir try Bloğuyla Çok Sayıda catch Kullanımı Örnek - Birden fazla catch bloğu - devam if (b == 0) throw sifir; else if (b == 1) throw bir; else if (b == -1) throw eksiBir; int c = a / b; System.out.println(); System.out.println(a + " / " + b + " = " + c); } catch (SifiraBolmeHatasi ozelDurum) { System.out.println(); System.out.println(ozelDurum.getMessage()); System.out.println("Bolen Sifir Olamaz!"); } catch (BireBolmeHatasi ozelDurum) { System.out.println(); System.out.println(ozelDurum.getMessage()); System.out.println("Bolen Bir; Sonuc Sayinin Kendisi!"); } 22 11 Bir try Bloğuyla Çok Sayıda catch Kullanımı Örnek - Birden fazla catch bloğu - devam catch (EksiBireBolmeHatasi ozelDurum) { System.out.println(); System.out.println(ozelDurum.getMessage()); System.out.println("Bolen Eksi Bir; Sonuc Sayinin Eksisi!"); } catch (Exception ozelDurum) { System.out.println(); System.out.println(ozelDurum.getMessage()); System.out.println("Genel Hata Olustu"); } System.out.println(); System.out.print("Bir daha denemek ister misin? (e/h) "); yanit = klavye.next(); System.out.println(); } while ((yanit.equals("e")) || (yanit.equals("E"))); } } 23 Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu 12 Kural Dışı Durum Sınıfı Kullanımı Bazı durumlarda oluşan kural dışı durumun yakalanması metodun dışına atılır ve metodu çağıran yerde yakalanarak çözülmesi istenebilir. Public void ornekYontem() throws SifiraBolmeHatasi ile oluşacak SifiraBolmeHatasi kural dışı durum metot dışına aktarılmıştır. import java.util.Scanner; class SifiraBolmeHatasi2 extends Exception { public SifiraBolmeHatasi2() { super("Bolen Sifir!"); } public SifiraBolmeHatasi2(String ileti) { super(ileti); } } 25 Kural Dışı Durum Sınıfı Kullanımı public class Bolme { public void asilBolme() throws SifiraBolmeHatasi2 { Scanner klavye = new Scanner(System.in); System.out.print("Bolunecek sayi:\t"); int a = klavye.nextInt(); System.out.print("Bolen sayi:\t"); int b = klavye.nextInt(); if (b == 0) throw new SifiraBolmeHatasi2("Bolen Sifir!"); int c = a / b; System.out.println(); System.out.println(a + " / " + b + " = " + c); } 26 13 Kural Dışı Durum Sınıfı Kullanımı public static void main(String [] args) { String yanit; Scanner klavye = new Scanner(System.in); do { Bolme islem = new Bolme(); try { islem.asilBolme(); } catch (SifiraBolmeHatasi2 ozelDurum) { System.out.println(); System.out.println(ozelDurum.getMessage()); System.out.println("Bolen Sifir Olamaz!"); } System.out.println(); System.out.print("Bir daha denemek ister misin? (e/h) "); yanit = klavye.next(); System.out.println(); } while ((yanit.equals("e")) || (yanit.equals("E"))); } } 27 Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu 14 İç İçe try - catch Blokları İç içe if-else ifadeleri kullanıldığı gibi iç içe try-catch blokları da kullanılabilir. try { try { ... } cath () { ... } } cath () { ... } 29 Konular Kural Dışı Durumlar try ve catch Blokları ve throw Komutu Exception Sınıfı Kural Dışı Durum Sınıfı Tanımlama Bir try Bloğuyla Çok Sayıda catch Kullanımı Kural Dışı Durum Sınıfı Kullanımı İç İçe try - catch Blokları finally Bloğu 15 finally Bloğu try-catch bloklarının sonuna finally bloğu yazılabilir. finally bloğu içindeki kod, try bloğu içinde kural dışı durum olsa da olmasa da çalışır. try-catch-finally üçlüsünün çalışması sırasında 3 durum ortaya çıkabilir: Programda hiçbir kural dışı durum oluşmaz ve catch bloğu çalışmaz. finally bloğu çalışır. Programda kural dışı bir durum oluşur ve catch bloğu tarafından yakalanır. Try bloğu özel durum oluşan noktada kesilir ve catch bloğu ardından da finally bloğu çalışır. Try bloğunda bir kural dışı durum oluşur ancak catch bloğunda uygun bir parametre olmadığından yakalanamaz. Ancak yine finally bloğu çalıştırılır. 31 finally Bloğu Scanner klavye = new Scanner(System.in); try { System.out.print(“Bolunecek sayi:\t”); int a = klavye.nextInt(); System.out.print(“Bolen sayi:\t”); int b = klavye.nextInt(); if (b == a) throw new Exception(“Bolen Sifir!”); int c = a / b; System.out.println(a + “ / “ + b + “ = ” + c); } cath (Exception ozelDurum) { System.out.println(ozelDurum.getMessage()); System.out.println(“Bolen Sifir Olamaz!”); } finally { System.out.println(“Bu ileti her durumda basilir!”); } 32 16