İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

Java “java.lang.ArithmeticException: / by zero” Hatası Nasıl Çözülür?

java-arithmeticexception-by-zero-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Hata mesajı ve stack trace satırı nasıl okunur?
  2. int, long, double ve % işlemleri neden farklı davranır?
  3. Bölmeden önce böleni if ile nasıl kontrol edersin?
  4. Kullanıcı girdisindeki hatayı try-catch ile nasıl yönetirsin?
  5. Sık Sorulan Sorular

Java java.lang.ArithmeticException: / by zero hatası, tam sayı bölmesinde bölenin sıfır olmasıyla oluşur. Çözüm için bölme veya yüzde işleminden önce bölen değeri kontrol edilmeli, sıfır durumunda hesaplama yapılmamalıdır. Hatanın hangi satırdan kaynaklandığını anlamak için stack trace içindeki sınıf, metot, dosya ve satır bilgisi okunabilir.

Hata mesajı ve stack trace satırı nasıl okunur?

Hata mesajı ve stack trace satırı nasıl okunur?

java.lang.ArithmeticException: / by zero hatası, int veya long türlerinde bölme ya da mod alma işleminin bölen değeri sıfır olduğunda oluşur. Java Dil Belirtimi, tam sayı bölme ve kalan işlemlerinde sağ taraftaki değer sıfırsa ArithmeticException fırlatılacağını belirtir.

Mesajın başındaki Exception in thread "main" ifadesi, istisnanın programın main metodunu çalıştıran iş parçacığında yakalanmadan sona ulaştığını gösterir. java.lang.ArithmeticException istisnanın tam sınıf adıdır. / by zero bölme veya mod işlemindeki bölenin sıfır olduğunu açıklar. ArithmeticException, RuntimeException sınıfından türediği için unchecked exception türündedir.

Aşağıdaki programda sıfır olan ogrenciSayisi değişkeni, beşinci satırdaki bölme işleminde kullanılıyor:

public class BolmeOrnegi {
    public static void main(String[] args) {
        int toplam = 10;
        int ogrenciSayisi = 0;
        int ortalama = toplam / ogrenciSayisi;
        System.out.println(ortalama);
    }
}

Program çalıştırıldığında örnek stack trace şu biçimde görünür:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at BolmeOrnegi.main(BolmeOrnegi.java:5)

Stack trace satırındaki BolmeOrnegi sınıfı, main metodu ve BolmeOrnegi.java:5 ifadesi hatanın kaynak dosyanın beşinci satırında oluştuğunu gösterir. Bu satırdaki toplam / ogrenciSayisi ifadesinde bölen ogrenciSayisi olduğu için önce bu değişkenin hangi değerle çalıştığını kontrol etmek gerekir. Birden fazla metot çağrısı varsa stack trace genellikle hatanın oluştuğu konumu üst sıralarda, bu metoda ulaşan çağrıları ise devamındaki satırlarda gösterir.

int, long, double ve % işlemleri neden farklı davranır?

int ve long türlerinde sıfıra bölme işlemi ArithmeticException oluşturur. Aynı durum, bu türlerle yapılan yüzde işleminde de geçerlidir. Örneğin 17 % 0 ifadesinde Java kalan değerini hesaplayamaz ve yine ArithmeticException fırlatır.

double işlemleri ise farklı kurallara göre değerlendirilir. Sıfır olmayan sonlu bir double değeri sıfıra bölersen sonuç işarete göre Infinity veya -Infinity olabilir. Sıfırın sıfıra bölünmesi ise matematiksel olarak belirli bir sonuç üretmediği için NaN verir. Kısa bir örnek:

System.out.println(5.0 / 0);
System.out.println(0.0 / 0);

Bu iki satırın çıktısı sırasıyla Infinity ve NaN olur. 5.0 ifadesi işlemi kayan noktalı aritmetiğe taşırken, 0.0 / 0 işleminde her iki operand da kayan noktalı hesaplama kurallarına göre değerlendirilir. Java’da kayan noktalı bölme, sıfıra bölme gerçekleşse bile çalışma zamanı istisnası fırlatmaz.

Bu nedenle bir int değişkenini double türüne dönüştürmek ArithmeticException oluşmasını önleyebilir, ancak sonucu otomatik olarak geçerli hâle getirmez. Örneğin öğrenci sayısı sıfırken toplam değerini double türüne çevirmek Infinity veya toplam da sıfırsa NaN üretebilir. Bu değerler programın devamında kullanılmadan önce bölenin neden sıfır olduğu değerlendirilmelidir.

Bölmeden önce böleni if ile nasıl kontrol edersin?

Bölmeden önce böleni if ile nasıl kontrol edersin?

Bölme işleminden önce bölenin sıfır veya geçersiz olup olmadığını kontrol edersen, beklenen kullanıcı girdilerinde ArithmeticException oluşmasını önleyebilirsin. Sınıf ortalaması hesabında bölen, öğrenci sayısıdır. Öğrenci sayısı sıfırsa ortalama hesaplanamaz ve programın bunu kullanıcıya açıkça bildirmesi gerekir.

Aşağıdaki programda kontrol yapılmadığı için kullanıcı öğrenci sayısı olarak 0 girdiğinde totalScore / studentCount ifadesi çalışırken hata oluşur:

import java.util.Scanner;

public class ClassAverage {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Öğrenci sayısı: ");
        int studentCount = scanner.nextInt();

        System.out.print("Not toplamı: ");
        int totalScore = scanner.nextInt();

        int average = totalScore / studentCount;

        System.out.println("Sınıf ortalaması: " + average);
    }
}

studentCount değeri 0, not toplamı ise 450 olduğunda güncel JDK'larda hata mesajının ilk satırı şu biçimdedir:

Exception in thread "main" java.lang.ArithmeticException: / by zero

Devamındaki stack trace satırları, hatanın ClassAverage.main içindeki hangi kaynak satırında oluştuğunu gösterir. Integer bölme ve kalan işlemlerinde sıfır bölen için oluşan davranışın ayrıntıları Java Language Specification içinde tanımlanır.

Kontrol eklenmiş sürümde, öğrenci sayısı geçersizse bölme işlemine hiç ulaşılmaz:

import java.util.Scanner;

public class ClassAverage {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Öğrenci sayısı: ");
        int studentCount = scanner.nextInt();

        if (studentCount <= 0) {
            System.out.println(
                "Öğrenci sayısı sıfırdan büyük olmalıdır. Ortalama hesaplanamadı."
            );
            return;
        }

        System.out.print("Not toplamı: ");
        int totalScore = scanner.nextInt();

        double average = (double) totalScore / studentCount;

        System.out.println("Sınıf ortalaması: " + average);
    }
}

Örneğin öğrenci sayısı 3, not toplamı 240 girilirse çıktı 80.0 olur. Öğrenci sayısı 0 ya da negatif bir değer girilirse program, ortalama hesaplamak yerine geçersiz girdiyi açıklar. Bu yaklaşım önemlidir çünkü boş bir liste veya sıfır öğrenci için matematiksel olarak tanımlı bir sınıf ortalaması yoktur.

Döngülerde de bölenin başlangıç değerini kontrol etmelisin. Örneğin aşağıdaki döngüde divisor sıfırdan başlarsa ilk bölme işlemi hata üretir:

for (int divisor = 1; divisor <= 3; divisor++) {
    int result = 12 / divisor;
    System.out.println(result);
}

Bölme yapılmadan önce şu noktaları kontrol etmek yararlı olur:

  • Kullanıcıdan alınan bölen sıfır veya negatif bir değer olabilir mi?
  • Liste ya da dizi boşken uzunluğunu bölen olarak kullanıyor musun?
  • Döngü sayacı sıfırdan mı başlıyor?
  • Koşul, bölenin sıfır olduğu durumda bölme satırına ulaşmayı engelliyor mu?

Kullanıcı girdisindeki hatayı try-catch ile nasıl yönetirsin?

Kullanıcı girdisinden gelen bölenin sıfır olabileceği ve bu durumun akışın başka bir noktasında ortaya çıktığı senaryolarda, yalnızca bölme ifadesini kapsayan dar bir try-catch kullanabilirsin. ArithmeticException, RuntimeException sınıfından türediği için unchecked exception'dır.

import java.util.Scanner;

public class ClassAverageWithCatch {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Öğrenci sayısı: ");
        int studentCount = scanner.nextInt();

        System.out.print("Not toplamı: ");
        int totalScore = scanner.nextInt();

        try {
            double average = (double) totalScore / studentCount;
            System.out.println("Sınıf ortalaması: " + average);
        } catch (ArithmeticException e) {
            System.out.println(
                "Öğrenci sayısı sıfır olamaz. Ortalama hesaplanamadı."
            );
        }
    }
}

Burada try bloğunun içine bütün programı almak yerine yalnızca riskli işlem yerleştirilmiştir. Önce if ile beklenen geçersiz girdiyi önlemek, try-catch yapısını ise kontrol akışının başka bir noktasında ortaya çıkabilecek aritmetik hatalara karşı tamamlayıcı olarak kullanmak daha okunabilir bir yapı sağlar. Her işlemi catch (Exception e) ile sarmalamak, hatanın gerçek nedenini gizleyebilir.

double kullanıldığında davranış farklıdır. Java'da kayan noktalı bölme, sıfıra bölme durumunda ArithmeticException fırlatmak yerine IEEE 754 kurallarına göre özel bir değer üretebilir:

double result = 5.0 / 0;
System.out.println(result);

Bu kodun çıktısı Infinity olur. Bu yüzden double'a dönüştürmek, sıfır böleni otomatik olarak geçerli hâle getirmez. Sonucu kullanmadan önce Double.isInfinite(result) veya Double.isNaN(result) ile kontrol etmek gerekebilir.

Java'da bu tür hata ayıklama alışkanlıklarını düzenli örneklerle geliştirmek isteyen öğrenciler, Java birebir özel ders programı hakkında bilgi edinebilir.

  • double kullanınca oluşabilecek Infinity veya NaN değerlerini kontrol etmemek.
  • Farklı türdeki tüm istisnaları tek bir catch (Exception e) bloğunda yakalamak.
  • % operatörünün de integer türlerde sıfır bölenle kullanıldığında hata üretebileceğini gözden kaçırmak.
  • Döngü sayacını sıfırdan başlatıp bu değeri bölen olarak kullanmak.

Sık Sorulan Sorular

Java’da 5.0 / 0 neden ArithmeticException fırlatmak yerine Infinity üretir?

5.0 ifadesi işlemi kayan noktalı bölmeye dönüştürdüğü için Java, sıfıra bölme durumunda integer bölmedeki gibi ArithmeticException fırlatmaz. Sıfır olmayan sonlu bir kayan noktalı değer sıfıra bölündüğünde sonuç, işaretine göre Infinity veya -Infinity olabilir.

Java’da yüzde operatörüyle yapılan işlemde neden aynı sıfıra bölme hatası oluşur?

Integer türlerde % operatörü kalan hesabı yaparken arka planda bir bölen kullanır. Bu nedenle 10 % 0 ifadesindeki bölen sıfır olduğu için ArithmeticException: / by zero oluşur.

Böleni if ile kontrol ettiğim hâlde try-catch kullanmam gerekir mi?

Böleni if ile kontrol ettiğinde beklenen sıfır girdisini önceden yönetmiş olursun. İşlem başka bir metottan gelen değerle yapılıyorsa veya bölme sırasında farklı bir kontrol akışından sıfır değer ulaşabiliyorsa, dar kapsamlı bir try-catch ek koruma sağlayabilir.

Öğrenci sayısı veya liste uzunluğu sıfırsa ortalama nasıl ele alınmalıdır?

Öğrenci sayısı ya da liste uzunluğu sıfırsa ortalama hesaplanmamalı ve kullanıcıya veri bulunmadığı veya hesaplama yapılamadığı açıklanmalıdır. Bölme işleminden önce 0 kontrolü yapmak, hem hatayı önler hem de programın bu durumu bilinçli biçimde yönetmesini sağlar.

Böleni işlemden önce doğrulamak, sıfıra bölme hatasını çözmenin en anlaşılır yoludur. Try-catch ise bu doğrulamayı tamamlayan, sınırları belirli bir güvenlik katmanı olarak kullanılabilir.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara