Kısa cevap: Java’da Scanner nextLine boş satır döndürüyorsa genellikle sebep, nextInt() çağrısından sonra Enter tuşuyla oluşan satır sonunun akışta kalmasıdır. nextLine() bu durumda yeni bir metin beklemek yerine mevcut satırın kalan kısmını okur; kalan kısım boş olduğu için boş metin döndürür.
Yani Scanner bozulmuş değildir. Sorun, nextInt() metodunun token tabanlı, nextLine() metodunun ise satır tabanlı çalışmasından kaynaklanır.
nextInt() Sonrasında nextLine() Neden Boş Döner?

nextInt(), kullanıcının girdiği satırdaki sayı bölümünü okur. Ancak kullanıcı sayıyı yazıp Enter’a bastığında akışa satır sonu karakteri de eklenir. Bu karakter, çoğu işletim sisteminde satır sonunu temsil eden olarak düşünülebilir.
Örneğin kullanıcı terminale şu değeri girsin:
23
Bu akışı adım adım inceleyelim:
nextInt(),23sayı tokenını okur.- Okuma konumu, mantıksal olarak
23değerinden sonra, satır sonu olankarakterinden hemen önce kalır. - Ardından
nextLine()çağrılır. nextLine(), bulunduğu satırın sonuna kadar olan kısmı okumaya çalışır.- Sayıdan sonra aynı satırda başka bir karakter bulunmadığı için sonuç boş metin olur.
Buradaki önemli ayrım şudur: nextInt() yalnızca sayı tokenını alır; Enter ile oluşan satır sonunu aynı şekilde tüketmiş sayılmaz. nextLine() ise satırın geri kalanını okur ve satır sonunu geçer. Geriye okunacak bir karakter kalmadığında sonuç "" olur.
Bu nedenle aşağıdaki akış beklenmedik görünebilir:
int age = scanner.nextInt();
String name = scanner.nextLine();
name değişkeninin değeri, kullanıcı yeni bir ad yazmadan önce boş bir metin olur. Sorun veri kaybından çok, iki metodun aynı girdiyi farklı ölçütlerle ele almasından kaynaklanır. nextInt() “sayıyı bul ve oku” yaklaşımındayken, nextLine() “mevcut satırın sonuna kadar oku” yaklaşımını kullanır.
Ad ve Yaş Örneğinde Hatalı Kod Terminalde Nasıl Davranır?
Şimdi yaş ve ad-soyad bilgisi alan kısa bir konsol programına bakalım. Bu örnekte yaş için nextInt(), ad-soyad için hemen ardından nextLine() kullanılıyor:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Yaşınızı girin: ");
int age = scanner.nextInt();
System.out.print("Ad soyadınızı girin: ");
String fullName = scanner.nextLine();
System.out.println("Merhaba, " + fullName + "! Yaşınız: " + age);
}
}
Kullanıcı yaş alanına 20 yazıp Enter’a bastığında terminalde yaklaşık olarak şu davranış görülür:
Yaşınızı girin: 20
Ad soyadınızı girin:
Merhaba, ! Yaşınız: 20
Burada programın ad-soyad istemini yazdırdığı görülür. Ancak imleç, kullanıcıdan yeni bir metin beklemeden sonraki satıra geçer. Bunun nedeni, nextLine() çağrısının kullanıcının henüz yazmadığı bir adı beklememesi; yaş girişinden kalan satır sonunu okuyup satırı tamamlamasıdır.
Sonuç olarak fullName değişkeninin değeri boş olur. Program da bu boş değeri selamlama cümlesine eklediği için çıktı şu biçime dönüşür:
Merhaba, ! Yaşınız: 20
Bu durum ilk bakışta ad bilgisinin silindiği veya Scanner’ın girdiyi kaybettiği izlenimi verebilir. Oysa kullanıcı henüz ad-soyad girmeden nextLine() çalışmıştır. Dolayısıyla program, yaş satırında kalan satır sonunu tüketmiş ve boş bir satır döndürmüştür.
Sorunu Çözmenin İki Yolu: Ek nextLine() mı, Satır Tabanlı Okuma mı?

Bu sorunu çözerken yalnızca “ek bir nextLine() yaz” kuralını ezberlemek yerine, imlecin giriş akışında nerede kaldığını kontrol etmelisin. nextInt() sayıyı okur; ancak sayının ardından bastığın Enter tuşuna karşılık gelen satır sonunu her zaman tüketmez. Bu nedenle hemen arkasından gelen nextLine() boş kalan kısmı okuyabilir.
1. nextInt() sonrasında satır sonunu tüketmek
Mevcut programın token tabanlı ilerliyorsa, yani yaş gibi sayıları nextInt() ile okuyorsan, bilinçli şekilde eklenen scanner.nextLine(); satır sonunu tüketir. Ardından ad-soyad bilgisi normal biçimde alınabilir.
Scanner scanner = new Scanner(System.in);
System.out.print("Yaşınız: ");
int yas = scanner.nextInt();
scanner.nextLine(); // Tamponda kalan satır sonunu tüketir
System.out.print("Ad soyadınız: ");
String adSoyad = scanner.nextLine();
System.out.println("Ad soyad: " + adSoyad);
System.out.println("Yaş: " + yas);
Kullanıcı önce 18, ardından Ayşe Yılmaz girerse beklenen çıktı şöyledir:
Yaşınız: 18
Ad soyadınız: Ayşe Yılmaz
Ad soyad: Ayşe Yılmaz
Yaş: 18
Bu yaklaşım, küçük değişiklikle mevcut kodu düzeltmek için pratiktir. Java’da giriş akışını ve temel programlama mantığını adım adım çalışmak için birebir Java özel ders programı içinde benzer örnekler üzerinden ilerlenebilir.
2. Tüm girdileri nextLine() ile okumak
Diğer yaklaşımda yaş da ad-soyad da önce metin olarak alınır. Yaş bilgisi daha sonra Integer.parseInt() ile sayıya çevrilir. Böylece bütün girişler satır satır okunur ve akış daha tutarlı hâle gelir.
Scanner scanner = new Scanner(System.in);
System.out.print("Yaşınız: ");
String yasMetni = scanner.nextLine().trim();
int yas = Integer.parseInt(yasMetni);
System.out.print("Ad soyadınız: ");
String adSoyad = scanner.nextLine().trim();
System.out.println("Ad soyad: " + adSoyad);
System.out.println("Yaş: " + yas);
Aynı girdide, yani yaş için 18 ve ad-soyad için Ayşe Yılmaz yazıldığında çıktı yine ad-soyad ve yaş bilgilerini doğru biçimde gösterir. Ancak sayı olmayan bir metin girilirse dönüşüm sırasında hata oluşabileceği için doğrulama eklemek gerekir.
| Yaklaşım | Okuma mantığı | Ne zaman tercih edilir | Dikkat edilmesi gereken nokta |
|---|---|---|---|
Ek nextLine() |
nextInt() ile sayı, ardından satır sonu temizlenir. |
Mevcut kod token tabanlı ilerliyorsa | Ek çağrı satır sonunu tüketmek içindir. |
| Satır tabanlı okuma | Her veri nextLine() ile alınır, gerektiğinde dönüştürülür. |
Form verisi ve doğrulama önemliyse | parseInt() hatası yakalanmalıdır. |
Kısacası, hızlı bir düzeltme gerekiyorsa ilk yöntem; kullanıcıdan satır satır veri alıyor ve hatalı girişleri kontrol etmek istiyorsan ikinci yöntem daha düzenli bir seçimdir.
Girdi Doğrulaması Nasıl Eklenir ve Hangi Yaklaşımı Seçmelisin?
Satır tabanlı okumada yaş bilgisini önce metin olarak alıp temizleyebilir, ardından sayıya dönüştürme işlemini try-catch ile güvenli hâle getirebilirsin.
Scanner scanner = new Scanner(System.in);
System.out.print("Yaşınızı girin: ");
String yasMetni = scanner.nextLine().trim();
try {
int yas = Integer.parseInt(yasMetni);
System.out.println("Girilen yaş: " + yas);
} catch (NumberFormatException e) {
System.out.println("Lütfen yaşı yalnızca rakamlarla girin.");
}
Kullanıcı 18 girerse terminalde Girilen yaş: 18 mesajı görünür. on sekiz gibi sayı biçiminde olmayan bir girişte ise program, hatanın ayrıntısını göstermek yerine Lütfen yaşı yalnızca rakamlarla girin. mesajını verir. Boş giriş de geçerli bir tam sayıya çevrilemeyeceği için aynı doğrulama kapsamına girer.
Hangi yaklaşımı seçeceğine karar verirken şu kontrol listesini kullanabilirsin:
- Önceki adım token tabanlı mı, satır tabanlı mı veri okuyor?
- Aynı akışta farklı veri türleri, örneğin metin ve sayı, birlikte kullanılıyor mu?
- Hatalı girişte yalnızca mesaj göstermek yeterli mi, yoksa kullanıcıdan yeniden deneme istenecek mi?
Bu mantığı farklı Java sorularıyla pekiştirmek için Java bilgi testlerini kullanarak hangi konularda tekrar yapman gerektiğini görebilirsin.
Sık Sorulan Sorular
nextInt() kullandıktan sonra her zaman ek nextLine() yazmak gerekir mi?
Hayır. Ek nextLine(), nextInt() sonrasında kalan satır sonunu temizleyip yeni bir metin satırı okumak istediğinde gerekir. Sonraki işlem yine nextInt() veya next() ise her zaman gerekli değildir.
nextLine() neden kullanıcıdan yeni giriş beklemeden boş metin döndürür?
Çünkü imleç, nextInt() sonrasında sayının bittiği yerde kalabilir. nextLine() da imlecin bulunduğu noktadan satır sonuna kadar kalan kısmı okur. Arada karakter kalmadıysa sonuç boş metin olur.
Kullanıcı yaş yerine harf girerse nextInt() ve Integer.parseInt() nasıl davranır?
nextInt() sayı beklerken harf girilirse InputMismatchException oluşturabilir. Integer.parseInt() ise sayı biçiminde olmayan metin için NumberFormatException oluşturur. Bu nedenle her iki yaklaşımda da hatalı giriş ihtimali ayrıca ele alınmalıdır.
Doğru çözüm, yalnızca ek bir satır eklemek değil; programdaki imleç konumunu, okuma biçimini ve doğrulama ihtiyacını birlikte değerlendirmektir.