İstisnalar (Exceptions) Nedir?
- İstisnalar (Exceptions), kod blokları arasında oluşan anormal durumlardır.
- Örneğin bir sayının sıfıra bölünmesi bir istisnai durumdur.
- Bu gibi durumlarda derleyici çalışma zamanı hatası (runtime error) verecek ve program yapısı kırılacaktır.
- Bu tip durumlarda Java’da hata yakalama nesnesi oluşturulur ve kontrol blokları ile hata göz ardı edilir yada farklı bir şekilde işlenir.
- Java’da hata istisna yönetimi try-catch-finally blok yapıları kullanılarak gerçekleşir.
- Bu söylediklerimizi bir örnekle ifade edelim.
Çalışma Zamanı Hatası Örneği (Runtime Error)
public class TryCatch {
public static void main(String[] args) {
//divided by zero Exception
int a=0;
double b = 40 /a;
System.out.println("Değer b:" +b);
}
}
Exception in thread “main” java.lang.ArithmeticException: / by zero
at TryCatch.main(TryCatch.java:7)
Derleyici Hata Yakalama
- Örnekte de görülebileceği gibi derleyici bize sıfıra bölme hatası ile ilgili bir hata mesajı göstermektedir.
- Mesaja dikkatli baktığımızda:
java.lang.ArithmeticException
ifadesini ve hatanın meydana geldiği satır numarasını (TryCatch.java:7) görebiliriz.
- Yazmış olduğunuz kodlarda meydana gelebilecek hatalar her zaman bu kadar kolay anlaşılır olmayabilir. Bu nedenle hata çıkabilecek kod parçacıklarını try-catch blokları içerisinde yazmamız iyi bir çözümdür.
try-catch’i Kullanmak

- Her ne kadar Java size çalışma zamanı hatalarını ayıklasa da, genellikle istisnaları kendiniz işlemek istersiniz.
- Bunu yaparak:
- Hata gerçekleştiğinde düzeltilmesine izin verilir,
- Programın otomatik olarak sonlanmasına engel oluruz.
- Birden fazla catch bloğu kullanılabilir.
try {
//istisna kontrolü kodu
}
catch(ExceptionTürü e) {
//(ExceptionTürü) hata
//alındığında çalışacak kod
}
…
finally {
//hata alınsada alınmasada
//çalışacak kod
}
Örnek
public class TryCatch {
public static void main(String[] args) {
//divided by zero Exception
int a=0;
double b=0;
try {
//istisna kontrolü
b = 40 / a;
}
catch(ArithmeticException e) {
//Hata kontrolü
System.out.println("Division by Zero");
}
finally {
System.out.println("Değer b:" +b);
}
}
}
———————–
Division by Zero
Değer b:0.0
İstisna Nesneleri ve Açıklamasını Göstermek
- Bir önceki örnekte vermiş olduğumuz catch bloğunun içerisinde iki bölüm mevcuttur.
- İlk bölüm hatanın tipidir. Bu örnek için: ArithmeticException
- İkinci bölüm ise nesnenin kendisi yani e.
- Hatanın neden kaynaklandığı e nesnesinin içerisinde yer alır ve aşağıdaki metot ile ekrana yazılabilir.
e.toString();
- Şimdi eğer catch metodu içerisinde tanımladığınız hata tipi ile karşılaştığınız hata tipleri uyuşmuyorsa hatayı yakalayamazsınız.
- Hata tipini tam olarak bilmiyorsanız, genel hata tipi olan Exception kullanmak size kolaylık sağlayacaktır.
Örnek: Alttaki iki kod aynı işi yapıyor.
public static void main(String[] args) {
//divided by zero Exception
int a=0, b=0;
try {
b = 40 / a;
}
catch(Exception e) {
System.out.println(e.toString());
}
System.out.println(“İstisina sonrası”);
}
public static void main(String[] args) {
//divided by zero Exception
int a=0, b=0;
try {
b = 40 / a;
}
catch(ArithmeticException e) {
System.out.println(e.toString());
}
System.out.println(“İstisina sonrası”);
}
Exception en genel hata tipidir.
İki kodda aynı hatayı yakalayacaktır.
Dizilerde İndeks Taşma Hatası
public class ArrayOutOfIndex {
public static void main(String[] args) {
int[] array = new int[] {1, 2, 3, 4, 5};
try {
System.out.println("Try Bloğu");
System.out.println("array[6]="+array[6]);
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println(e.toString());
System.out.println("Dizi indeks hatası!");
}
}
}
—————————————
Try Bloğu
java.lang.ArrayIndexOutOfBoundsException: 6
Dizi indeks hatası!
Çoklu catch Blokları
- Programda birden fazla hata olma ihtimali varsa, tüm ihtimaller kadar catch bloğu oluşturulabilir.
- Java 7 ile beraber gelen bir değişiklik sayesinde birden fazla hata tipini tek bir catch bloğu ile kontrol edebilirsiniz.
catch(ArrayIndexOutOfBoundsException | ArithmeticException e)
- Sonrasında programda dikkat edilmesi gereken nokta catch bloğunun ilk yakalanan exception için tetikleneceğidir.
- try bloğu içerisinde yer alan diğer satırlardaki hatalar atlanacağından catch bloğuna takılmayacaktır.
Örnek: Çoklu catch Bloğu
public static void main(String[] args) {
int[] array = new int[] {1, 2, 3, 4, 5};
int a=0, b=0;
try {
System.out.println("Try Bloğu");
System.out.println("array[6]="+array[6]);
a = 20 / b;
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println(e.toString());
}
catch(ArithmeticException ex) {
System.out.println(ex.toString());
}
}
Program dallanma yaptığı için sıfıra bölme hatası yakalanmayacaktır.
Örnek: Tek catch Bloğu ile çoklu hata kontrolü
public static void main(String[] args) {
int[] array = new int[] {1, 2, 3, 4, 5};
int a=0, b=0;
try {
System.out.println("Try Bloğu");
System.out.println("array[6]="+array[6]);
a = 20 / b;
}
catch(ArrayIndexOutOfBoundsException | ArithmeticException e){
System.out.println(e.toString());
}
}
———————————————–
Try Bloğu
java.lang.ArrayIndexOutOfBoundsException: 6
İç içe Yuvalanmış try İfadeleri
- Java da bir try bloğunun içerisine yeni bir try-catch bloğu oluşturulabilir.
- Biz bu yapılara iç-içe try-catch blokları diyoruz.
- Derleyici hata meydana geldiği zaman otomatik olarak en içteki try bloğundan itibaren çalışmaya başlar ve işlenen tüm try blokları içerisinde yakalan tüm hataları işler.
- Gerekmedikçe kullanmayınız.
Örnek
public class NestedTryCatch {
public static void main(String[] args) {
int[] dizi= {1,2};
try {
try {
int a=1, b=0;
b=a/(a-a);
}
catch(ArithmeticException e) {
System.out.println(e.toString());
}
dizi[3]=9;
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e.toString());
}
}
}
———————————————–
java.lang.ArithmeticException: / by zero
java.lang.ArrayIndexOutOfBoundsException: 3
finally Kullanımı
- Finally kullanımında program içerisinde istisna ile karşılaşıldığında, programın normal akışı değişeceğinden dolayı programda sapmalar olabilir.
- Örneğin dosya okuma-yazma işlemlerinde hata olsa da olmasa da dosyamızı program sonunda kapatmamız gerekir yada veritabanından veri çektikten sonra veritabanı bağlantısını sonlandırmanız gerekiyor olabilir.
- Bu gibi durumlarda istisna işleyicisin dosyayı kapatan kodu atlamamasını isteye bilirsiniz.
- finally sözcüğü bu tip işlemlerde kullanılmak için tasarlanmıştır.
Örnek
public static void main(String[] args) {
File dosya=new File("C:\\workspace\\kitap.txt");
File dosya2=new File("C:\\workspace\\kitapkopya.txt");
char data[]=new char[(int) dosya.length()];
try(FileWriter yaz=new FileWriter(dosya2)) {
FileReader reader=new FileReader(dosya);
reader.read(data);
yaz.write(data);
}
catch (IOException e) {
e.printStackTrace(); //Hata yığınını ekrana basar
}
finally {
System.out.println("Dosya kapatıldı");
}
}
throw Anahtar Kelimesi
- Program geliştiricisi uygulamanın herhangi bir yerinde kendisi bir istisna üretebilir.
- trow kelimesi ile fırlatılan bu istisna başka bir yerde kullanılabilir.
- Yada bilinen bir istisnai durum için açıklama içeriği değiştirilebilir.
- Bu durumu bir örnek ile açıklayalım.
Örnek
import java.util.Scanner;
public class SayiBol {
public static int sayiBol(int bolunen, int bolen) {
if (bolen==0)
throw new ArithmeticException("Sayı sıfırdan farklı olmalı");
else
return bolunen /bolen;
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
try {
System.out.println("Birinci sayı:");
int a= s.nextInt();
System.out.println("İkinci sayı:");
int b= s.nextInt();
System.out.println("Sonuc: "+sayiBol(a, b));
}
catch (Exception e) {
System.out.println(e.toString());
}
}
}
throws Anahtar Kelimesi
- Eğer bir metot işleyemediği yada işlemek istemediği bir istisnaya (exception) neden oluyorsa metot bu durumu throws anahtar kelimesi ile bildirebilir.
- Bir metot tanımlamasında throws anahtar kelimesi kullanılıyorsa bu metodu çağıran kod parçacıkları içinde metottun oluşturacağı istisnayı yakalayabilecek bir try-catch bloğu kullanılmak zorundadır.
public int method(int index) throws Exception
- Yukarıdaki ifade ile Bu metot içerisinde bir hata oluşursa hatayı bir üst metoda gönder ve bu metodu çağıran metot hata ile ilgilensin.
- Burada hata tipini en sonda throws ile gönderiyoruz.
Örnek
public class throwsExp {
private int[] dizi=new int[] {1, 2, 3, 4};
public int method(int index) throws Exception{
return dizi[index];
}
public static void main(String[] args) {
throwsExp obj=new throwsExp();
try {
for (int i=0; i<=4; i++) {
System.out.println(obj.method(i));
}
}
catch(Exception e) {
System.out.println(e.toString());
}
}
}
Java’da en çok karşılaşılan Hata Türleri
Hata Tipleri | Hatanın Anlamı |
ArithmeticException | Aritmatiksel bir işlem sırasında oluşan hata. Sıfıra bölme gibi. |
ArrayIndexOutOfBoundsException | Dizi indeks sınırlarının dışındadır. |
ArrayStoreException | Dizi yapısına uymayan bir değer kaydedilmeye çalışıldığında |
ClassCastException | Uygunsuz class atama işlemi |
IllegalArgumentException | Uygun olmayan argüman kullanımı |
NullPointerException | Herhangi bir nesne değişkenine ilk değer atamadan kullanımı |
IllegalMonitorStateException | Uygun olmayan monitör işlemi |
IllegalStateException | Sistemin uygun pozisyonda olmadığını belirtir |
IOException | Genel giriş/çıkış hataları |
NumberFormatException | Uygun olmayan sayı formatı hatası |
SecurityException | Güvenlik hatası |
StringIndexOutOfBounds | String yapısının sınırlarından çıkma hatası |
NoSuchMethodException | Kıllanılan methodun bulunmama hatası |