Algorithms and Data Structures

advertisement
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
Download