Exception’ı daha iyi algılamak/anlamlandırmak için İstisna ya da İstisnai Durum diye mi adlandırmalıyım? Şundan eminim ki ortalama bir bilgisayar programcısının, exception dendiğinde kafasında üç aşağı beş yukarı şöyle bir algı oluşuyor: Bir metodu kodlarken, metodun normal akışını bozan bir durumdur exception. Mesela: bir dosyayı okumak istiyoruz ama öyle bir dosya yok. Bu tür durumları ifade etmek, oluştuğunda çaresine bakmak veya birilerinin bakmasını sağlamak için programlama dilleri bir takım araç veya yapılar tanımlamışlardır.

İlk olarak anlatacaklarıma temel oluşturması için Java penceresinden bakıldığında exception nasıl birşeydir, exception’larla nasıl çalışırız basit olarak açıklayayım:

Java’da Throwable ana sınıfı ile exception tanımlanır ve üç alt sınıf ile exception’lar farklı anlamlar kazanır: Error,Exception, RuntimeException.

Error

Java Virtual Machine (JVM)’e havale edilmesi gereken ve her ne kadar mümkün olsa da program içerisinde müdahele etmenin gereksiz olduğu durumu ifade eder. Mesela: OutOfMemoryError program için ayrılan hafızanın tükendiğini gösterir. Hafıza olmadan ne yapılabilir ki? Error durumunda uygulamanın kapatılması gerekir.

Exception

Çaresine program içerisinde bakılabilecek durumları ifade eder. Mesela bir işi yapmak için veritabanına bağlanmanız gerekiyor, ağ sorunu yüzünden bağlanamadığınız veya bağlandınız ama diyelim işlemi yaparken bir veritabanı tablosuna ait kısıtı bozdunuz. Sizin veya sizin yazdığınız metodu çağıran kişinin alabileceği bir takım aksiyonlar olabilir: bağlantı sorunu varsa tekrar denemek, bunu kullanıcıya raporlamak ya da kısıtı bozan durumu anlayıp, bozmayacak şekilde yeniden istekte bulunmak gibi.

RuntimeException

Program çalışırken, erişilen bir değişkenin null olması, veya bir dizinin var olamayan bir indeks’teki elemanına erişmek gibi telafisi olmayan durumları ifade eder. Bunlar için çoğu zaman bir aksiyon almanız gerekmez. Programın böyle bir durumda işine devam etmemesi gerekebilir.

Programı kodlarken exception’ları fırlatırız (throw), bizim çağırdığımız başka bir metod fırlatır (throws), onları yakalarız ve çaresine bakarız (try-catch-finally). Bunları Java anlatan kitaplara bırakarak asıl anlatmak istediğim meseleye geçiyorum.

Error’ları JVM’e havale ettiğimizde, geriye: Exception ve RuntimeException kalır. Ve bu iki exception (ve tabiki bunların alt sınıfları) sırasıyla kontrollü (checked) ve kontrolsüz (unchecked) exception diye bilinirler. Kontrollü olması programı daha yazarken bunların yakalanması ve icabına bakılması veya tekrar fırlatılmasını gerektirir. Kontrolsüz exception’ları yakalamak zorunluluğu yoktur, ama oluştuğunda çaresine de bakılması gerekebilir. Yani birinde herşeyi kontrol etme ve bunun getirdiği yük, diğerinde hiçbir şey kontrol etmeme lüksü öte yandan oluşmaması için bir çaba harcanması gerekliliği var. Şöyle de bir durum var ki eğer kimse yakalamazsa JVM bunu yakalayıp, programı sonlandırabilir.

 

/**
 * Created by Kerem Sırma on 30.10.2015.
 */
import java.util.Scanner;//Klavyeden değer girdirebilmek için bu kütüphaneyi import etmemiz gerekiyor.
import java.util.InputMismatchException;//InputMismatchException istinasını fırlatabilmek için bu kütüphaneyi import etmeliyiz.

public class DivideByZeroWithExceptionHandling {
    public static int quotient(int numerator, int denominator)
            throws ArithmeticException {
        return numerator / denominator;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);//Klavyeden değer girilmesini sağlayan nesnemizi türettik.
        boolean continueLoop = true;//Veri girişine ihtiyaç olup olmadıına karar vercez.
        do {//do-while başlangıcı
            try {//Bölme sonucunu bulalım
                System.out.print("Please enter an integer numerator: ");
                int numerator = scanner.nextInt();//Payı klavyeden girdik
                System.out.print(("Please enter an integer denominator"));
                int denominator = scanner.nextInt();//Paydayı girdik
                int result = quotient(numerator,denominator);//Girilen değerleri fonksiyonumuza göndererek sonucu hesaplattım.
                System.out.printf("\nresult: %d / %d = %d\n", numerator, denominator, result);//payı,paydayı ve sonucu ekrana yazdırdık.
                continueLoop = false;//Sorun yoksa döngüye girip tekrar soru sormasına gerek olmadığı için değere false dedik.
            }// try son
            catch (InputMismatchException inputMismatchException) {//bu catch blogu ekrar int harici başka veri ürü girersek hata fırlatacak.
                System.err.printf("\nException: %s\n", inputMismatchException);
                scanner.nextLine();
                System.out.println("You must intergers. Please try again.\n");
            }//end catch
            catch (ArithmeticException arithmeticException) {//sayı 0a bölünemez hatasını bu exception la veriyoruz.
                System.err.printf("\nException: %s\n", arithmeticException);
                System.out.println("Zero is an invalid denominator.Please try again.\n");
            }//try son

        } while (continueLoop);//do-while son
    }
}//class sonu


Facebook'dan yorumla