Blog 06 January 2026

Java’da scan.nextLine() Atlama Problemi: Neden Olur, Nasıl Çözülür?

Java’da scan.nextLine() Atlama Problemi: Neden Olur, Nasıl Çözülür?
Java öğrenirken (özellikle konsoldan veri alma tarafında) en sık karşılaşılan “sinir bozucu ama çok öğretici” problemlerden biri şudur:

scan.nextLine() çağırıyorum ama sanki hiç sormadan geçiyor, boş string alıyor.

Bu yazıda problemin nedenini, en yaygın senaryoları ve temiz çözüm yöntemlerini akıcı bir şekilde anlatacağım. Yazının sonunda da “en güvenli input şablonunu” paylaşacağım.

Problem Ne? (Kısa Senaryo)

Şöyle bir kod yazdınız:
import java.util.Scanner;

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

        System.out.print("Yaş: ");
        int yas = scan.nextInt();

        System.out.print("Ad Soyad: ");
        String adSoyad = scan.nextLine(); // <-- burası atlıyor

        System.out.println("Yaş: " + yas);
        System.out.println("Ad Soyad: " + adSoyad);
    }
}

Çalıştırınca “Ad Soyad” sorması gerekirken direkt geçiyor ve adSoyad çoğu zaman boş geliyor.

Neden Oluyor? (Asıl Sebep: Buffer’da Kalan “Enter”)

Bu problemin temel sebebi şu:

nextInt() gibi metotlar sadece sayıyı okur, satırın sonundaki Enter (newline \n) karakterini bırakır.

Ardından gelen nextLine() ise “satırı oku” dediği için buffer’da zaten duran o newline’ı okur.

Sonuç: nextLine() hemen biter ve boş string döner.

Yani aslında “atlamıyor”; okuyacak şey olarak Enter’ı bulup onu okuyor.

Bunu günlük hayattaki gibi düşün:

nextInt() sayı paketini alıyor ama masada kalan fişi (Enter) bırakıyor.

nextLine() geliyor, “masadaki her şeyi alayım” diyor.

Masada sadece fiş var → alıp gidiyor.

Hangi Metot Kombinasyonlarında Daha Çok Görülür?

Aşağıdaki metotlar satır sonunu bırakabildiği için hemen arkasından nextLine() gelirse sorun çıkarabilir:

nextInt()

nextDouble()

nextLong()

next() (kelime bazlı okur, satır sonu kalabilir)

Özet: “Token-based” metotlardan sonra “line-based” metot gelince risk artar.

Çözüm 1: Araya “Boş nextLine()” Koymak (En Popüler)

En pratik çözüm: nextInt() sonrası bir tane buffer temizleme satırı eklemek.
System.out.print("Yaş: ");
int yas = scan.nextInt();
scan.nextLine(); // buffer temizle: Enter'ı tüket

System.out.print("Ad Soyad: ");
String adSoyad = scan.nextLine();

Bu ek satır, buffer’da kalan \n karakterini okur ve böylece asıl nextLine() kullanıcıdan düzgün satır alır.

Ne zaman kullanılır?
Hızlıca mevcut kodu düzeltmek istediğinizde.

Çözüm 2: Her Şeyi nextLine() ile Alıp Parse Etmek (En Temiz ve En Güvenli)

Profesyonel yaklaşım şu: Konsoldan gelen her şeyi satır olarak al, sonra dönüştür.
System.out.print("Yaş: ");
int yas = Integer.parseInt(scan.nextLine());

System.out.print("Ad Soyad: ");
String adSoyad = scan.nextLine();

Bu yöntem:

Buffer problemlerini azaltır

Hata kontrolünü kolaylaştırır

Kullanıcı “12 ” gibi boşluklu girse bile yönetilebilir

Ne zaman kullanılır?
Daha sağlam bir input yapısı kurmak istediğinizde (özellikle projelerde ve sınav sorularında).

Çözüm 3: next() Kullanıp Tam Ad Soyad Alamama Problemi (Kardeş Problem)

Bazı öğrenciler “Ad Soyad” için next() kullanır ve şunu görür:

“Murat Babayiğit” yazarsınız

Sadece “Murat” gelir

Çünkü next() boşluğa kadar okur. Ad-soyad, adres gibi çok kelimeli girdiler için doğru metot nextLine()’dır.

Bonus: Sağlam Input Şablonu (Hatalara Dayanıklı)

Kullanıcı yanlış girerse programın patlamaması için:
Scanner scan = new Scanner(System.in);

int yas;
while (true) {
    System.out.print("Yaş: ");
    String s = scan.nextLine();
    try {
        yas = Integer.parseInt(s);
        break;
    } catch (NumberFormatException e) {
        System.out.println("Lütfen geçerli bir sayı girin!");
    }
}

System.out.print("Ad Soyad: ");
String adSoyad = scan.nextLine();

System.out.println("Yaş: " + yas);
System.out.println("Ad Soyad: " + adSoyad);

Bu yapı:

Buffer sorunlarını en aza indirir

Hatalı girişte kullanıcıyı tekrar sorar

Konsol uygulamalarında “en öğretici” pratiklerden biridir

Kısa Özet (Akılda Kalsın)

nextInt() sayıyı okur, Enter’ı bırakır

nextLine() satırı okur, Enter’ı görünce hemen biter

Çözüm:

nextInt() sonrası scan.nextLine() ile buffer temizle
← Geri Dön

Yorumlar

Henüz yorum yapılmamış.

Yorum yapmak için Giriş Yap veya Kayıt Ol.