Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Java "java.util.InputMismatchException" Hatası Nasıl Çözülür?

java-util-inputmismatchexception-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. java.util.InputMismatchException ne anlama gelir?
  2. Scanner bu hatayı neden üretir?
  3. Girdi uyuşmazlığı adım adım nasıl teşhis edilir?
  4. Hatalı Scanner kodu nasıl düzeltilir?

Java java.util.InputMismatchException hatasını çözmek için önce hatanın oluştuğu Scanner metodunun hangi türde değer beklediğini ve girilen değerin buna uyup uymadığını kontrol et. Sayı okuyorsan hasNextInt() veya hasNextDouble() ile girdiyi okumadan önce sınayabilir, uygun değilse kullanıcıdan yeni bir değer isteyebilirsin. "InputMismatchException, Scanner'ın okuduğu değeri çağırdığın veri tipiyle eşleştiremediğini gösterir."

java.util.InputMismatchException ne anlama gelir?

java.util.InputMismatchException ne anlama gelir?

Scanner, girdiyi token adı verilen parçalara ayırır. nextInt() gibi bir okuma metodu çağırdığında sıradaki tokenı beklenen türe dönüştürmeye çalışır. Dönüştürme başarısız olursa hata, program çalışırken o okuma çağrısında ortaya çıkar; bu bir derleme hatası değildir.

Örneğin nextInt() tam sayı beklerken sıradaki token dokuz ise onu int olarak okuyamaz. Yalnızca harf içeren girdiler değil, beklenen sayısal türün aralığını aşan değerler de bu istisnaya yol açabilir. Hata oluştuğunda uyuşmayan token girdiden atlanmaz; aynı okuma çağrısını değiştirmeden yinelemek aynı değerde yeniden takılabilir.

Scanner bu hatayı neden üretir?

Yaygın neden, sayı bekleyen bir metoda sayı olarak yorumlanamayan bir metin verilmesidir. Seçtiğin metodun ne okumaya çalıştığı önemlidir: nextInt() tam sayı, nextDouble() ondalıklı sayı okur. next() ise sıradaki tokenı metin olarak alır; tokenın sayı biçiminde olmasını şart koşmaz.

ÇağrıBeklenen veriUygun örnekUyuşmazlık örneği
nextInt()Tam sayı24yirmi dört
nextDouble()Ondalıklı sayı3,5 (virgül ondalık ayracı bekleniyorsa)3.5 (aynı ayarda uyuşmayabilir)
next()Sonraki token, metin olarakelma veya 24Bu çağrıda tür uyuşmazlığı oluşmaz.

Ondalık ayraç da girdinin bir parçasıdır. 3,5 ile 3.5 aynı sayıyı anlatmak için yazılmış olsa bile Scanner bunları kullanılan sayı biçimine göre farklı değerlendirebilir. Nokta ya da virgül içeren bir girişte nextDouble() hata veriyorsa girilen biçimle Scannerın beklediği ondalık ayracını karşılaştır. next() ise bu değerleri sayıya dönüştürmeden metin olarak okur.

Girdi uyuşmazlığı adım adım nasıl teşhis edilir?

Girdi uyuşmazlığı adım adım nasıl teşhis edilir?

InputMismatchException, Scanner'ın okuduğu değeri çağırdığın veri tipiyle eşleştiremediğini gösterir. Teşhis için yalnızca hata veren satıra bakmak yerine, metodun beklediği türü, kullanıcının girdiği gerçek tokenı ve uygulanacak düzeltmeyi birlikte değerlendirmelisin.

  1. Hata veren okuma metodunu bul: İstisna genellikle nextInt(), nextDouble() veya benzer bir okuma metodunun çağrıldığı satırda oluşur.
  2. Hedef değişkenin türünü kontrol et: nextInt() tam sayı, nextDouble() ondalıklı sayı bekler. Metodun beklediği veri türü ile değişkenin amacı uyumlu olmalıdır.
  3. Gerçek tokenı incele: Kullanıcıdan alınan girişin tamamını değerlendir. abc, 42.5 veya sayı ile birlikte yazılmış birim gibi değerler, nextInt() için geçerli değildir.
  4. Beklenen türle karşılaştır: Kod tam sayı bekliyorsa yalnızca tam sayı biçimindeki girişleri kabul et. Ondalık bir değer okunacaksa nextDouble() kullan ve giriş biçimini buna göre kontrol et.
  5. Ondalık ayraç biçimini kontrol et: nextDouble() kullanılan kodlarda girilen değerin ondalık ayraç biçimi, Scanner için geçerli olan bölgesel ayarla uyumlu olmalıdır. Örneğin 3,14 ile 3.14 biçimleri her yapılandırmada aynı şekilde yorumlanmayabilir.
  6. Uygun ön kontrolü seç: Tam sayılar için hasNextInt(), ondalıklı sayılar için hasNextDouble() kullanabilirsin. Ön kontrol başarısız olduğunda geçersiz tokenı scanner.next() ile tüketip yeniden giriş istemelisin.

Bu akış, düzeltmeyi yalnızca exception veren satıra uygulamak yerine, beklenen veri türü ile gerçek giriş arasındaki uyuşmazlığa göre seçmeni sağlar.

Hatalı Scanner kodu nasıl düzeltilir?

Aşağıdaki kod, kullanıcı metin girdiğinde nextInt() çağrısında hata üretir. Çünkü metod, doğrudan tam sayı olmayan tokenı okumaya çalışır.

import java.util.Scanner;

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

        System.out.print("Bir tam sayı gir: ");
        int sayi = scanner.nextInt();

        System.out.println("Okunan sayı: " + sayi);
    }
}

Daha güvenli yaklaşımda önce hasNextInt() ile girişin uygun olup olmadığı kontrol edilir. Kontrol başarısızsa scanner.next() geçersiz tokenı tüketir ve döngü yeni bir giriş ister.

import java.util.Scanner;

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

        System.out.print("Bir tam sayı gir: ");

        while (!scanner.hasNextInt()) {
            System.out.println("Geçersiz giriş. Lütfen bir tam sayı gir.");
            scanner.next();
            System.out.print("Bir tam sayı gir: ");
        }

        int sayi = scanner.nextInt();
        System.out.println("Okunan sayı: " + sayi);
    }
}

Geçerli giriş için beklenen çıktı

Bir tam sayı gir: 42
Okunan sayı: 42

Önce geçersiz, sonra geçerli giriş için beklenen çıktı

Bir tam sayı gir: abc
Geçersiz giriş. Lütfen bir tam sayı gir.
Bir tam sayı gir: 42
Okunan sayı: 42

Java ve veri türleri bilgisini tamamlayıcı biçimde ölçmek için Java bilgi testini çözebilirsin.

Kısa kontrol listesi

  • Okuma metodunun beklediği veri türünü doğrula.
  • Kullanıcının girdiği gerçek tokenı incele.
  • Giriş türüne uygun hasNextInt() veya hasNextDouble() kontrolünü seç.
  • Geçersiz tokenı scanner.next() ile tüket.
  • Geçerli giriş alınana kadar yeniden dene.

Bu adımlar, Scanner ile veri okurken oluşan tür uyuşmazlıklarını daha düzenli biçimde bulup düzeltmene yardımcı olur.

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