Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize Java Exception Handling yani Java Hata Yakalama konusuyla devam ediyoruz.
Java’da yazmış olduğumuz kodun sağlıklı bir şekilde yaşamına devam etmesi için Exception Handling konusu çok önemlidir. Aksi takdirde farklı sebeplerden bir hata aldığımızda geliştirmiş olduğumuz kod yaşam döngüsünü sonlandıracak ve mobil uygulamamız, web sitemiz veya masaüstü uygulamamız çalışamaz hale gelecektir. Bu gibi durumlar son kullanıcı gözünde hiçte hoş karşılanmamaktadır. Burada yazılımcılara büyük görev düşmektedir. Her ne kadar yazılımcı hata durumlarına yüzde yüz önlem alamayacak olsa da bu oranı olabildiğince yüksek tutmak son kullanıcının hatasız bir şekilde uygulamayı tecrübe etmesini sağlayacaktır. Java Exception Handling konusunun son kullanıcıdan çok yazılımcıları etkileyen bir yönü de Throw Exception (Hata Fırlatma) konusudur. Hata fırlatma özelliği yazılımcının işini kolaylaştıran aynı zamanda hataları kendi koduna göre özelleştirmesini sağlayan bir özelliktir. Bu şekilde bir hata alındığında hata logları yazılımcı için daha okunaklı bir hal alacaktır.
Java Exception Handling (Hata Yakalama)
Exception sınıfları Java’da diğer sınıfların üretildiği Object sınıfından türemektedir. Throwable sınıfı Object sınıfının bir alt sınıfıdır. Throwable sınıfından ise Exception sınıfı türer Exception sınıfından da bildiğimiz checked ve unchecked olarak bilinen diğer Exception sınıfları türetilir. Aşağıdaki grafik yazılanları daha net bir şekilde görmenize yardımcı olacaktır.
Java Exception Handling
Yukarıdaki görselde mavi renkte gösterilen Error ve Runtime Exception ve Runtime Exceptiondan türeyen alt Exception sınıfları Unchecked Exception olarak işaretlenmiştir. Kırmızı renkte olan Exception sınıfıları ise Checked Exception olarak işaretlenmiştir.
Checked Exceptions
Checked Exception Java’da kod geliştirme esnasında try-catch-finally bloğu içerisinde yakalanan ve daha sonra işlem yapılabilen, istenildiği takdirde bypass edilerek programın çalışmasına belkide kullanıcının hiç haberi olmadan devam edilmesini sağlayan exception çeşitleridir. Checked Exception alındığında çalışma anında düzeltme yapıp düzgün parametrelerle kodun çalışmasına devam edilebilir. Checked Exception sınıflarının tamamı Exception sınıfından türetilmiştir. Gelişmiş IDE’ler sayesinde checked exceptionların kontrolleri daha kolay bir şekilde sağlanmaktadır. Eğer kodunuzu notepad ile değilde daha gelişmiş bir IDE ile geliştiriyorsanız (örn: intellij idea, eclipse, netbeans) ve yazdığınız kodda Checked Exception varsa IDE sizi uyarıyor ve bu fırlatılan exception’ ı handle etmeniz yani yakalayıp gerekli işlemi yapmanız gerektiğini söylüyor. İşte bu durumda yazılımcılar olarak bizler, ya exception’ ın fırlatıldığı satırı try-catch bloğu içine alıyoruz ya da bir üst metoda throws ediyoruz.
Unchecked Exceptions
Unchecked exception tipinde Runtime Exception Java’da yine kod geliştirme esnasında try-catch-finally bloğuyla yakalanabilir ve checked exception tipinde olduğu gibi istenildiği gibi işlem devam ettirilebilir. Fakat kodu geliştirme esnasında IDE yazılımcıyı uyarmaz. Yani orada bir hata olacağı geliştirme esnasında değil çalışma esnasında ortaya çıkar. Bir ArrayList nesnesi oluşturup içerisine 5 adet değer koyulduktan sonra, ArrayList nesnesi içinden 6. değer çağrıldığında, yukarıdaki görselde gördüğümüz mavi işaretli IndexOutBoundException sınıfından türetilmiş, ArrayIndexOutOfBoundException sınıfından hata fırlatılır. Elbette geliştirme esnasında buradaki ArrayList nesnesinden elemanın çekildiği satır try-catch bloğuyla kontrol edilebilir, fakat bunu geliştiricinin ön görmesi gerekmektedir.
Bir diğer unchecked exception türü olan Error sınıfları ise kod geliştirme esnasında veya çalışma esnasında yazılımcının yakalayamacağı, problemin diğer Exception türlerine göre daha ciddi olduğu durumları yansıtmaktadır. Kodun çalışması esnasında Java virtual machine içinde uygulamanın çalıştırılması için ayrılmış bellek alanın dolması sonucu OutOfMemoryError fırlatılır. Bu hatayı kod içinden yakalamamız mümkün değildir. Önüne geçmek için çalışmalar yapabiliriz, mesela belliği kontrollü kullanırız veya uygulamayı ayağa kaldırırken bellek alanını genişletiriz fakat eğer bu hata alınmışsa uygulamanın kapanmaktan başka çaresi kalmamıştır.
Kod Örnekleri
Şimdi örnek kodlarla yukarıda bahsettiğimiz Checked ve Unchecked Exception durumlarını ele alalım;
CheckedException olarak aşağıdaki örneği inceleyebiliriz;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* Created by ErenBasaran on 19.08.2018
*/
public class CheckedExceptionSample {
/**
* readFile metodu projenin bulundugu pathten test.txt adinda bir dosya
* okumaya calisiyor.
* Bu kodu gelistirirken IDE bizi dosyanın orda bulunamama durumuna karsi
* uyariyor ve bir hata olabilecegini bunu kontrol altina almamiz
* gerektigini belirtiyor.
*/
public void readFile() {
try {
FileInputStream inputStream = new FileInputStream(“test.txt”);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* readAnotherFile metodunda ise readFile metodundaki islemin aynisi
* yapiliyor fakat olusabilecek hatanin kontrol edilme yetkisi bir üst
* sinifa veriliyor.
* @throws FileNotFoundException
*/
public void readAnotherFile() throws FileNotFoundException {
FileInputStream inputStream = new FileInputStream(“test1.txt”);
}
/**
* readFile metodu kendi icinde hata ile ilgilendigi için direk
* kullanilabilirken, readAnotherFile metodu hata ile ilgilenme
* yetkisini bir üst sinifa verdigi icin cagrildigi sinif icinde
* gerekli kontrol islemlerinin yapilmasi gerekiyor.
* @param args
*/
public static void main(String[] args) {
CheckedExceptionSample ces = new CheckedExceptionSample();
ces.readFile();
try {
ces.readAnotherFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import java.io.FileInputStream; import java.io.FileNotFoundException;
/** * Created by ErenBasaran on 19.08.2018 */ public class CheckedExceptionSample {
/** * readFile metodu projenin bulundugu pathten test.txt adinda bir dosya * okumaya calisiyor. * Bu kodu gelistirirken IDE bizi dosyanın orda bulunamama durumuna karsi * uyariyor ve bir hata olabilecegini bunu kontrol altina almamiz * gerektigini belirtiyor. */ public void readFile() { try { FileInputStream inputStream = new FileInputStream(“test.txt”); } catch (FileNotFoundException e) { e.printStackTrace(); } }
/** * readAnotherFile metodunda ise readFile metodundaki islemin aynisi * yapiliyor fakat olusabilecek hatanin kontrol edilme yetkisi bir üst * sinifa veriliyor. * @throws FileNotFoundException */ public void readAnotherFile() throws FileNotFoundException { FileInputStream inputStream = new FileInputStream(“test1.txt”); }
/** * readFile metodu kendi icinde hata ile ilgilendigi için direk * kullanilabilirken, readAnotherFile metodu hata ile ilgilenme * yetkisini bir üst sinifa verdigi icin cagrildigi sinif icinde * gerekli kontrol islemlerinin yapilmasi gerekiyor. * @param args */ public static void main(String[] args) { CheckedExceptionSample ces = new CheckedExceptionSample(); ces.readFile();
try { ces.readAnotherFile(); } catch (FileNotFoundException e) { e.printStackTrace(); } } } |
Unchecked Exception olarak aşağıdaki örneği inceleyebiliriz;
import java.util.ArrayList;
/**
* Created by ErenBasaran on 19.08.2018
*/
public class UncheckedExceptionSample {
public static void main(String[] args) {
ArrayList
strList.add(“Taha”); //0. value
strList.add(“Vehbi”); //1. value
strList.add(“Alper”); //2. value
String val = strList.get(3);
System.out.println(val);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.ArrayList;
/** * Created by ErenBasaran on 19.08.2018 */ public class UncheckedExceptionSample {
public static void main(String[] args) {
ArrayList strList.add(“Taha”); //0. value strList.add(“Vehbi”); //1. value strList.add(“Alper”); //2. value
String val = strList.get(3); System.out.println(val); } } |
Kodda geliştirme esnasında hiç bir hata ile karşılaşılmaz. Bu kodu alarak kendi IDE’nize yapıştırabilir ve geliştirme anında hiç bir hata olmadığını görebilirsiniz. Fakat kodu çalıştırdığınızda aşağıdaki gibi bir çıktı ile karşılaşırsınız.
Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at com.mobilhanem.core.UncheckedExceptionSample.main(UncheckedExceptionSample.java:18)
Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.get(ArrayList.java:429) at com.mobilhanem.core.UncheckedExceptionSample.main(UncheckedExceptionSample.java:18) |
Java Throw Exception
Yazımızın şimdiye kadarki kısmında fırlatılan hataları yakaladık veya bir üst metoda işlem yapması için biz fırlattık. Bu bölümde kendi geliştirdiğimiz ve hata ile karşılaşılması muhtemel olan bir kod parçası yazdığımızı düşünelim. Bu kodu kullanarak uygulama geliştirecek diğer yazılımcıları uyarmamız gerekebilir, yada bu hata ile karşılaşıldığında ne yapılması gerektiğini kodu bizden sonra geliştirecek kişiye bırakabiliriz. Bu durumu kod ile örneklendirerek anlatmaya çalışırsak;
Öncelikle kendimize ait bir exception sınıfı oluşturabiliriz,
/**
* Created by ErenBasaran on 19.08.2018
*/
public class MobilhanemException extends Exception {
public MobilhanemException(String message) {
super(message);
}
}
/** * Created by ErenBasaran on 19.08.2018 */ public class MobilhanemException extends Exception { public MobilhanemException(String message) { super(message); } } |
Ardından bir dosya okuma metodu yazarak hata alınması durumunda kendi exception sınıfımızdan bir exception fırlatabiliriz,
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* Created by ErenBasaran on 19.08.2018
*/
public class MobilhanemFileReader {
public void read(String fileName) throws MobilhanemException {
try {
FileInputStream fileInputStream = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
throw new MobilhanemException(“Dosya bulunamadı!”);
}
}
}
import java.io.FileInputStream; import java.io.FileNotFoundException;
/** * Created by ErenBasaran on 19.08.2018 */ public class MobilhanemFileReader {
public void read(String fileName) throws MobilhanemException { try { FileInputStream fileInputStream = new FileInputStream(fileName); } catch (FileNotFoundException e) { throw new MobilhanemException(“Dosya bulunamadı!”); } } } |
Son olarak bir metot yazarak bu metodu tetikleyebiliriz,
/**
* Created by ErenBasaran on 19.08.2018
*/
public class MobilhanemSample {
public static void main(String[] args) {
MobilhanemFileReader fileReader = new MobilhanemFileReader();
try {
fileReader.read(“test.txt”);
} catch (MobilhanemException e) {
e.printStackTrace();
}
}
}
/** * Created by ErenBasaran on 19.08.2018 */ public class MobilhanemSample {
public static void main(String[] args) { MobilhanemFileReader fileReader = new MobilhanemFileReader(); try { fileReader.read(“test.txt”); } catch (MobilhanemException e) { e.printStackTrace(); } } } |
Eğer aradığımız yerde test.txt gibi bir dosya yoksa aşağıdaki gibi bir çıktı alırız;
com.mobilhanem.core.MobilhanemException: Dosya bulunamadı!
at com.mobilhanem.core.MobilhanemFileReader.read(MobilhanemFileReader.java:16)
at com.mobilhanem.core.MobilhanemSample.main(MobilhanemSample.java:11)
com.mobilhanem.core.MobilhanemException: Dosya bulunamadı! at com.mobilhanem.core.MobilhanemFileReader.read(MobilhanemFileReader.java:16) at com.mobilhanem.core.MobilhanemSample.main(MobilhanemSample.java:11) |
Küçük ölçekli projelerden çok daha büyük ölçekli projelerde kendi exception sınıflarımızı yazmamız daha büyük önem taşımaktadır. Bu şekilde hataların daha kolay kontrol edilebildiği bir yapı kurulabilir.
Sonuç
Java Exception Handling kod geliştirme işlemlerinde büyük önem taşımaktadır. Hataları yakalamak veya hataları fırlatmak ile kod üzerinde kurulan kontrol mekanizmaları sonucunda, kullanıcının önüne onlarca belki de yüzlerce satır hata log u getirmek yerine bir tool box içerisinde işlemin başarısız olduğu belirtilebilir. Örneğin uygulamanın loglamasıyla ilgili bir hata oluştu, bu kullanıcıyı ilgilendiren bir durum değil, sistemin bu hata sebebiyle kullanıcı tarafına hata log u basması yerine bu hatayı bypass ederek sadece yazılımcının haberi olmasını sağlayarak çalışmasına devam edebilir. Bu gibi kritik durumların çözülmesi için geliştirdiğimiz kodlarda Java Exception Handling konusuna büyük önem vermeliyiz.
Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.
Tüm Java Dersleri için tıklayınız..
27