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

Java Scanner nextLine boş satır: Neden Olur ve Nasıl Düzeltilir?

java-scanner-nextline-bos-satir
Bu yazıda neler var?
  1. nextInt() Sonrasında nextLine() Neden Boş Döner?
  2. Ad ve Yaş Örneğinde Hatalı Kod Terminalde Nasıl Davranır?
  3. Sorunu Çözmenin İki Yolu: Ek nextLine() mı, Satır Tabanlı Okuma mı?
  4. Girdi Doğrulaması Nasıl Eklenir ve Hangi Yaklaşımı Seçmelisin?
  5. Sık Sorulan Sorular

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() 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:

  1. nextInt(), 23 sayı tokenını okur.
  2. Okuma konumu, mantıksal olarak 23 değerinden sonra, satır sonu olan karakterinden hemen önce kalır.
  3. Ardından nextLine() çağrılır.
  4. nextLine(), bulunduğu satırın sonuna kadar olan kısmı okumaya çalışır.
  5. 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ı?

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.

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