Skip to main content

İstisnalar

Java'da istisna (exception), programın normal yürütmesi sırasında ortaya çıkan hataları temsil eden nesnelerdir. Bir istisna, bir hata durumunu tanımlamak ve programın bu hatayı nasıl ele alacağını belirlemek için kullanılır. İstisnalar, programda bir hata durumu meydana geldiğinde, normal yürütme akışından ayrılarak istisna durumunu ele alan özel bir kod bloğuna yönlendirilirler.

Java'da birçok farklı türde istisna vardır. Bunlar arasında:

  1. Kontrol edilen istisnalar: Kodun bir parçası tarafından atılan ve kodun çağrıldığı yerde ele alınması gereken istisnalardır. Örneğin, bir dosya işlemi sırasında dosyanın bulunamaması gibi durumlar kontrol edilen istisna olarak ele alınır.
  2. Kontrol edilmeyen istisnalar: Programın çalışması sırasında ortaya çıkan ve önceden tahmin edilemeyen istisnalardır. Örneğin, bellek yetersizliği, sıfıra bölme hatası gibi durumlar kontrol edilmeyen istisna olarak ele alınır.
  3. Error: Ciddi programlama hatalarının ortaya çıkmasından kaynaklanan istisnalardır. Örneğin, StackOverflowError ve OutOfMemoryError gibi hatalar kontrol edilemez ve programın normal yürütmesi sonlandırılır.

Java'da istisna yönetimi için try-catch blokları kullanılır. try bloğu içindeki kod, istisna durumlarının meydana gelebileceği kod bloğudur. Eğer bir istisna oluşursa, catch bloğu, bu istisna durumunu ele alır ve istisna durumunun tipine göre uygun şekilde işlem yapar.

Aşağıdaki örnek, bir dosyanın okunması sırasında meydana gelebilecek istisna durumlarını ele almak için bir try-catch bloğu kullanır:

try {
File file = new File("file.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.out.println("Dosya bulunamadı: " + e.getMessage());
}

Yukarıdaki örnekte, File sınıfı, bir dosyanın okunması için kullanılır. Ancak, dosya bulunamadığında bir FileNotFoundException istisna durumu oluşabilir. Bu nedenle, try bloğu içindeki kod, bir catch bloğu ile çevrelenir ve bu blok, dosya bulunamadığında istisna durumunu ele alır. İstisna durumu, getMessage() metodu ile alınır ve kullanıcıya bir hata mesajı olarak gösterilir.

İstisna Türleri

  1. ArithmeticException: Matematiksel bir işlemin sonucu sıfıra bölündüğünde veya geçersiz bir aritmetik işlem yapıldığında oluşur.
  2. ArrayIndexOutOfBoundsException: Bir diziye geçersiz bir dizinle erişildiğinde meydana gelir.
  3. ClassNotFoundException: Bir sınıfın yürütme zamanında yüklenememesi durumunda oluşur.
  4. FileNotFoundException: Bir dosya bulunamadığında oluşur.
  5. IOException: Giriş/çıkış işlemleri sırasında oluşabilecek genel bir istisna türüdür.
  6. NullPointerException: Bir nesne referansının null olduğu durumlarda ortaya çıkar.
  7. NumberFormatException: Bir dizeyi sayıya dönüştürme işlemi sırasında bir hata oluştuğunda oluşur.
  8. StringIndexOutOfBoundsException: Bir dizenin geçersiz bir karakter dizinleme işlemi yapılması durumunda oluşur.

Bu istisna türleri, programın normal yürütmesi sırasında oluşabilecek birçok farklı hata durumunu temsil eder. Bu istisnalar, kodunuzda hata durumlarını ele almak için kullanılabilir ve try-catch blokları aracılığıyla ele alınabilir. Ayrıca, kendi özel istisna türlerinizi de tanımlayabilir ve kullanabilirsiniz.

ArithmeticException

Java'da ArithmeticException, matematiksel bir işlemin geçersiz veya imkansız olduğu durumlarda oluşan bir istisna türüdür. Bu hatanın en yaygın nedeni, bir sayının sıfıra bölünmeye çalışılmasıdır. Örneğin, aşağıdaki kodda bir ArithmeticException hatası oluşacaktır:

int x = 5;
int y = 0;
int z = x / y; // ArithmeticException: / by zero

Bu örnekte, y sıfıra eşit olduğu için z'nin değerini hesaplamak için x sıfıra bölünmeye çalışılır. Bu, bir ArithmeticException hatasına neden olur.

Bu hatayı önlemek için, öncelikle bir sayının sıfıra bölünmesini engellemelisiniz. Bu, if veya try-catch blokları kullanarak yapılabilir. Örneğin:

int x = 5;
int y = 0;

if (y != 0) {
int z = x / y;
System.out.println(z);
} else {
System.out.println("Cannot divide by zero.");
}

Bu örnekte, y sıfıra eşit olduğunda, bölme işlemi yapılmadan önce bir kontrol yapılır ve bir hata mesajı yazdırılır.

ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException hatası, bir dizinin sınırları dışındaki bir indis numarasına erişilmeye çalışıldığında oluşan bir istisna türüdür. Bu hatanın nedeni, bir diziye geçersiz bir dizin numarası verilmesidir. Örneğin, aşağıdaki kodda bir ArrayIndexOutOfBoundsException hatası oluşacaktır:

int[] numbers = {1, 2, 3};
int index = 3;
int value = numbers[index]; // ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

Bu örnekte, index 3'e eşit olduğu için, numbers dizisinde 3. indise erişmeye çalışılır. Ancak bu dizi sadece 0, 1 ve 2 indis numaralarına sahiptir. Bu nedenle, bir ArrayIndexOutOfBoundsException hatası oluşur.

Bu hatayı önlemek için, bir dizide geçerli bir indis numarası kullanmanız gerekir. Bu, if veya try-catch blokları kullanarak yapılabilir. Örneğin:

int[] numbers = {1, 2, 3};
int index = 3;

if (index >= 0 && index < numbers.length) {
int value = numbers[index];
System.out.println(value);
} else {
System.out.println("Index out of bounds.");
}

Bu örnekte, index dizinin sınırları içinde mi diye kontrol edilir ve bir hata mesajı yazdırılır.

ClassNotFoundException

ClassNotFoundException hatası, bir sınıfın yüklenemediğinde oluşan bir istisna türüdür. Bu hatanın nedeni, bir sınıfın isminin yanlış yazılmış veya yüklenemeyecek bir yerde olmasıdır. Bu hata genellikle, bir sınıfın derlenmemesi veya paketlenmemesi sonucu oluşur.

Örneğin, aşağıdaki kodda bir ClassNotFoundException hatası oluşacaktır:

try {
Class.forName("com.example.MyClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

Bu örnekte, Class.forName yöntemiyle com.example.MyClass sınıfı yüklenmeye çalışılır. Ancak, bu sınıf derlenmemiş veya yüklenemeyecek bir yerde olabilir. Bu nedenle, bir ClassNotFoundException hatası oluşur.

Bu hatayı önlemek için, öncelikle sınıfın doğru bir şekilde derlendiğinden ve yüklenemeyecek bir yerde olmadığından emin olmanız gerekir. Ayrıca, sınıfın tam adını doğru bir şekilde yazdığınızdan da emin olmalısınız.

FileNotFoundException

FileNotFoundException hatası, bir dosyanın bulunamaması veya açılmaması durumunda oluşan bir istisna türüdür. Bu hatanın nedeni, bir dosyanın belirtilen yolda veya dizinde mevcut olmaması veya kullanıcının gerekli izinlere sahip olmamasıdır.

Örneğin, aşağıdaki kodda bir FileNotFoundException hatası oluşacaktır:

try {
File file = new File("my_file.txt");
FileReader reader = new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}

Bu örnekte, my_file.txt dosyası, kodun çalıştığı dizinde mevcut değilse veya kullanıcı bu dosyayı okumak için gerekli izinlere sahip değilse, bir FileNotFoundException hatası oluşur.

Bu hatayı önlemek için, öncelikle belirtilen dosyanın doğru bir şekilde adlandırıldığından ve yolunun doğru olduğundan emin olmanız gerekir. Ayrıca, dosyayı okumak veya yazmak için gerekli izinlere sahip olduğunuzdan da emin olmalısınız. Dosya izinlerini kontrol etmek için File sınıfındaki canRead() ve canWrite() yöntemlerini kullanabilirsiniz.

IOException

IOException, girdi/çıktı işlemleri sırasında oluşan bir istisna türüdür. Bu istisnalar, bir dosya okunurken veya yazılırken, ağ bağlantısı kurulurken veya veritabanına erişilirken oluşabilir.

Java'nın tüm I/O sınıfları, bir IOException fırlatabilirler. Bu sınıflar arasında FileReader, FileWriter, FileInputStream, FileOutputStream, Socket, ServerSocket, URLConnection vb. yer almaktadır.

Örneğin, aşağıdaki kodda bir IOException hatası oluşacaktır:

try {
FileWriter writer = new FileWriter("my_file.txt");
writer.write("Hello, world!");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}

Bu örnekte, my_file.txt dosyasına yazılırken bir hata oluşursa, bir IOException hatası oluşur.

Bu hatayı önlemek için, girdi/çıktı işlemlerini yapmadan önce dosya veya veritabanı bağlantısı gibi kaynaklara erişim için gerekli izinlere sahip olduğunuzdan emin olun. Ayrıca, girdi/çıktı işlemleri sırasında oluşabilecek hataların kontrolünü sağlamak için hata yönetimi kodu eklemelisiniz.

NullPointerException

NullPointerException, null bir referansa işaret eden bir nesnenin veya dizinin kullanılmaya çalışılması durumunda oluşan bir istisna türüdür. Bu hatanın nedeni, bir nesnenin veya dizinin null değerine sahip olmasıdır ve null değerine sahip bir nesneye veya dizine erişim yapmaya çalışmak, NullPointerException hatasına neden olur.

Örneğin, aşağıdaki kodda bir NullPointerException hatası oluşacaktır:

String str = null;
int length = str.length();

Bu örnekte, str değişkeni null bir referansa sahip olduğundan, str.length() ifadesi null bir nesne üzerinde çağrıldığı için bir NullPointerException hatası oluşur.

Bu hatayı önlemek için, null bir nesneye veya dizine erişim yapmadan önce, null olmayan bir nesne veya dizinin varlığından emin olun. Ayrıca, null bir nesne veya dizine erişim yaparken hata yönetimi kodu eklemek, programınızın hata vermeden çalışmasını sağlayabilir.

NumberFormatException

NumberFormatException, bir dizgeyi sayıya dönüştürmeye çalışırken, geçersiz bir sayı biçimi nedeniyle oluşan bir istisna türüdür. Örneğin, bir dizgeyi Integer.parseInt() yöntemiyle bir tamsayıya dönüştürmeye çalışırken, dizgenin bir sayı değil de bir harf veya sembol içerdiği durumlarda NumberFormatException hatası oluşur.

Örneğin, aşağıdaki kodda bir NumberFormatException hatası oluşacaktır:

String str = "abc";
int num = Integer.parseInt(str);

Bu örnekte, str değişkeni bir sayı değil, bir dize olduğundan ve "abc" gibi bir değer içerdiğinden, Integer.parseInt() yöntemi bu dizeyi bir tamsayıya dönüştüremediği için bir NumberFormatException hatası oluşur.

Bu hatayı önlemek için, bir dizgeyi sayıya dönüştürmeden önce, dizenin sayısal bir değer içerip içermediğini kontrol etmeniz gerekmektedir. Ayrıca, sayısal bir dizgeyi bir sayıya dönüştürürken, hata yönetimi kodu eklemek, programınızın hata vermeden çalışmasını sağlayabilir.

StringIndexOutOfBoundsException

Java'da StringIndexOutOfBoundsException, bir dizge üzerinde bir karakter veya alt diziye erişmeye çalışırken, geçersiz bir dizin veya aralık nedeniyle oluşan bir istisna türüdür. Örneğin, bir dizenin belirli bir konumundaki karaktere veya bir alt dizenin belirli bir aralığına erişmeye çalışırken, dizindeki karakter sayısından daha büyük bir dizin belirtilirse StringIndexOutOfBoundsException hatası oluşur.

Örneğin, aşağıdaki kodda bir StringIndexOutOfBoundsException hatası oluşacaktır:

String str = "example";
char c = str.charAt(10);

Bu örnekte, str değişkeni 7 karakter uzunluğunda olduğundan, 10. konumda bir karakter yoktur ve charAt() yöntemi bu dizinde bir karaktere erişmeye çalışırken bir StringIndexOutOfBoundsException hatası oluşur.

Bu hatayı önlemek için, bir dizgede belirli bir karaktere veya alt diziye erişmeden önce, dizinin uzunluğunu kontrol etmeniz gerekmektedir. Ayrıca, bir dizindeki bir karaktere veya alt diziye erişirken hata yönetimi kodu eklemek, programınızın hata vermeden çalışmasını sağlayabilir.