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?

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 veri | Uygun örnek | Uyuşmazlık örneği |
|---|---|---|---|
nextInt() | Tam sayı | 24 | yirmi dört |
nextDouble() | Ondalıklı sayı | 3,5 (virgül ondalık ayracı bekleniyorsa) | 3.5 (aynı ayarda uyuşmayabilir) |
next() | Sonraki token, metin olarak | elma veya 24 | Bu ç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?

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.
- Hata veren okuma metodunu bul: İstisna genellikle
nextInt(),nextDouble()veya benzer bir okuma metodunun çağrıldığı satırda oluşur. - 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. - Gerçek tokenı incele: Kullanıcıdan alınan girişin tamamını değerlendir.
abc,42.5veya sayı ile birlikte yazılmış birim gibi değerler,nextInt()için geçerli değildir. - 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. - Ondalık ayraç biçimini kontrol et:
nextDouble()kullanılan kodlarda girilen değerin ondalık ayraç biçimi,Scanneriçin geçerli olan bölgesel ayarla uyumlu olmalıdır. Örneğin3,14ile3.14biçimleri her yapılandırmada aynı şekilde yorumlanmayabilir. - Uygun ön kontrolü seç: Tam sayılar için
hasNextInt(), ondalıklı sayılar içinhasNextDouble()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()veyahasNextDouble()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.