İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır

Exception'lar

Exception Kavramı

Her program doğru olarak yazılması durumunda hatasız olarak çalışacaktır. Ancak bu ideal bir durumdur ve hatasız bir program yazmak hiç bir kimseye nasip olmamıştır. Önemli olan hatasız bir uygulama yapmak değil, hata oluştuğunda bunu programın anlayabilmesini ve önlem alabilmesini sağlamaktır. Hiç bir şey yapılamıyorsa, en azında kullanıcıya hatanın bildirilmesi gerekmektedir. Ancak, bir hata olması durumunda program kesinlikle çökmemelidir.

Hatanın önlenmesi için en çok kullanılan yöntem, hata oluşturabilecek sorunların konrol edilmesidir. Örneğin, bir dosyayı okumadan önce programcı okumak istediği bir dosyanın okumaya çalıştığı yerde olup olmadığını kontrol edebilir. Ancak her durumu programcının öngörebilmesi ve önlemini alması her zaman mümkün olmaz. Hatanın ve anormal durumların ele alınmasında en iyi yol 'exception' kullanmaktadır. Exception'ların devreye girmesiyle hata ayıklamak çok daha kolaylaşmıştır. Exception'larla bir program parçası hatayı anlamaya ve değerlendirmeye zorlanabilir. Örneğin okunacak bir dosyanın orada bulunmaması durumunda programcının bunu anlaması ve bir tepki vermesi zorunlu hale getirilebilir.

Try-Catch Bloğu

Çağrılan bir method'ta hata oluşması durumunda bunun yakalanması için try-catch bloğu kullanılır :

try{
	// Hata oluşturabilecek herhangi bir işlem.
}catch(Exception e){
	// Hata durumunda yapılacaklar.
}

Girilen bir sayının tek mi çift mi olduğunu anlayan basit bir program yapalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class OddEvenDifferantiatorWithoutException{
  2   public static void main(String[] args){
  3     String input=args[0];
  4     int number=Integer.parseInt(input);
  5     int mod=number % 2;
  6     if ( mod == 0){
  7       System.out.println("cift");  
  8     }else{
  9       System.out.println("tek");  
 10     }
 11  
 12   }
 13 }

Bu program çalışır durumdadır. Kullanıcının girdiği bir sayının çift mi tek mi olduğunu anlayabilmektedir. Ancak kullanıcı ya sayı yerine "A" girerse? Bu durumda program çalışmayacak o anda her şey çokecektir. Bunu önlemenin yolu elbette önce girilen String'n bir sayı olup olmadığını anlamaktır. Ancak bu çok karmaşık bir işlemdir. Bütün karakterler alınmalı ve her birinin rakam olup olmadığı tek tek kontrol edilmelidir. Bunu yapan isNumber() diye bir method yazılabilir. Ancak Exception kullanarak daha basit bir şekilde sorun çözülebilmektedir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class OddEvenDifferantiatorWithException{
  2   public static void main(String[] args){
  3     try{
  4       String input=args[0];
  5       int number=Integer.parseInt(input);
  6       int mod=number % 2;
  7       if ( mod == 0){
  8         System.out.println("Çift");  
  9       }else{
 10         System.out.println("Tek");  
 11       }
 12       System.out.println("Teşekkürler");
 13     }catch(NumberFormatException e){
 14       System.out.println("Sayı giriniz!");  
 15     }
 16  
 17   }
 18 }

NumberFormatException, Integer class'ının static methodu parseInt() tarafından fırlatılabilmektedir. Burada sadece Exception da yakalanabilirdi. Ancak bu durumda diğer hatalar için de aynı mesaj çıkacaktı.

Try-Catch-Finally

Bir exception'ın fırlaması durumunda kodun yürütülmesi o noktada durur ve artık catch() bloğunun içerisindekiler yürütülmeye başlar. Bazı durumlarda bir işlemin hata olsa da olmasa da gerçekleştirilmesi istenebilir. Try bloğunun içindeki kod parçaları hata durumunda çalışmayacağı için buraya konması doğru olmaz. Yukarıdaki örnekte hata olması durumunda "Teşekkürler" yazısı ekrana basılmayacaktır. Diyelim ki biz kullanıcıya hata yapsa da yapmasa de teşekkür etmek istiyoruz. Bunun için kod şu hale getirilmeklidir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class OddEvenDifferantiatorWithExceptionAndFinally{
  2   public static void main(String[] args){
  3     try{
  4       String input=args[0];
  5       int number=Integer.parseInt(input);
  6       int mod=number % 2;
  7       if ( mod == 0){
  8         System.out.println("cift");
  9       }else{
 10         System.out.println("tek");  
 11       }
 12     }catch(NumberFormatException e){
 13       System.out.println("enter number");  
 14     }finally{
 15       System.out.println("thank");  
 16     }
 17  
 18   }
 19 }

Throw

Programcı istediği yerde kendisi de bir Exception fırlatabilir. Bir yerde throw keyword'üyle fırlattığı exception'u başka bir yerde kendi yakalayabilir. Girilen bir rakamaın 1000'ler basamağındaki rakamını bulan bir program yazalım. Ancak bir sayının binler basamağındaki sayısını bulabilmek için girilen sayının binden büyük olması gerekir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class ThousandsFinderWithThrow{
  2   public static int getTousands(int number){
  3     if(number<1000){
  4       throw new IllegalArgumentException("1000'de kuçuk sayi girilmemeli!");
  5     }
  6     int division=number/1000;
  7     int digit=division % 10;
  8     return digit;
  9   }
 10   public static void main(String[] args){
 11     try{
 12       String input=args[0];
 13       int number=Integer.parseInt(input);
 14       int digit=getTousands(number);
 15       System.out.println("Binler : "+digit);  
 16     }catch(IllegalArgumentException e){
 17       String message=e.getMessage();
 18       System.out.println(message);  
 19     }
 20  
 21   }
 22 }

Throws

Bir method kendisini çağıran kodu Exception'u yakalamaya (try-catch içine almaya) zorlayabilir. Bunun için yapılması gereken method'un tanımında throws keyword'üyle Exception'un adının verilmesidir.

public void method() 
	throws AnyException
{
	// Her hangi bir lod parçası.
}	

Bu methodun çağrıldığı yerde mutlaka

public void another(){	
	try{
		object.method();
	}catch(AnyException e){
		System.out.println("Bir hata oluştu!");
	}	
}

biçimde yakalanması gerekir.

Bir method bir exception'u yakalamak istemezse kendisi de onu throws listesine alabilir.

public void another()	
	throws AnyException		
{	
	object.method();
}

Ancak bu sefer de bu methodu hangi method çağırıyorsa o yakalamak zorundadadır. Tabii o da throws listesinde göstermezse. En sonunda mutlaka bir method bu exception'u yakalayacaktır.

RuntimeException'lar

Bazı exceptionları yakalamak zorunlu değidir. Bunun için o exception'un runtime exception olması gerekir. Yani RuntimeException veya onu extend etmiş herhangi bir exception olması. Bu tip exception'lar genellikle hatanın çalışma esnasında yaklanması gerektiği durumlarda kullanılır. IllegalArgumentException ve NumberFormatException class'ları runtime exception'dur.

Exception Türetme

Kullanıcı kendi exception'larını da yazabilir.

class AnyKindOfException extends Exception{

}

ve diğer exceptionlarla aynı şekilde fırlatabilir veya yakalayabilir.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır