İçeriğe geç

Menü

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

Java nextInt() Sonrası nextLine() Neden Boş Okuyor ve Nasıl Düzelir?

java-nextint-sonrasi-nextline-neden-bos-okuyor
Bu yazıda neler var?
  1. nextInt() sonrasında nextLine() neden boş değer okur?
  2. nextInt(), next(), nextLine() ve hasNextInt() nasıl ayrılır?
  3. Ad ve puan alan program nasıl doğru biçimde yazılır?
  4. Geçersiz sayı girişi nasıl kontrol edilir ve akış nasıl toparlanır?
  5. Sık Sorulan Sorular

Java nextInt() sonrası nextLine() boş okuyor gibi görünür çünkü bu iki yöntem girdiyi aynı birimle okumaz. nextInt() sayısal tokenı alırken satır sonunu geride bırakabilir; hemen arkasından çağrılan nextLine() mevcut satırda okunacak karakter bulamazsa boş bir String döndürür.

Sorun Scanner nesnesinin bozulması değildir. İmlecin tokenın sonunda mı, satırın sonunda mı kaldığını takip ederek satır sonunu ayrıca tüketebilir veya baştan satır temelli bir okuma düzeni seçebilirsin.

nextInt() sonrasında nextLine() neden boş değer okur?

nextInt() sonrasında nextLine() neden boş değer okur?

Scanner, varsayılan ayırıcı düzeninde girdiyi boşluk karakterleriyle ayrılan tokenlara böler. nextInt() bir sonraki tokenı int olarak okur. Ancak sayıdan sonra gelen satır ayırıcısı, sayı tokenının parçası değildir ve bu çağrıdan sonra imlecin önünde kalabilir.

nextLine() ise token aramaz. Mevcut satırda imleç ile satır ayırıcısı arasındaki kalan metni döndürür ve ardından sonraki satıra geçer. Bu aralıkta hiç karakter yoksa dönen değer "" olur.

90⏎ girdisinde imlecin hareketi

Aşağıdaki gösterimde | gerçek girdinin parçası değildir, imlecin konumunu gösterir:

Girdi:              90⏎
nextInt() öncesi:   |90⏎
nextInt() sonrası:  90|⏎
nextLine() sonrası: 90⏎|

nextInt() değeri 90 olarak okur, fakat imleç hâlâ sayı ile satır ayırıcısının arasındadır. Hemen çağrılan nextLine() bu nedenle boş bir metin döndürür. Sorunun kaynağı, token temelli okuma ile satır temelli okumanın arka arkaya kullanılmasıdır.

import java.util.Scanner;

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

        int puan = scanner.nextInt();
        String metin = scanner.nextLine();

        System.out.println("Puan = " + puan);
        System.out.println("Metin = [" + metin + "]");
    }
}

90 girdisi için köşeli parantezler arasında hiçbir karakter görünmez:

Girdi: 90
Puan = 90
Metin = []

Sayıdan sonra başka bir satırda metin okuyacaksan önce mevcut satırın kalanını tüketip ardından yeni satırı okuyabilirsin:

int puan = scanner.nextInt();
scanner.nextLine();
String metin = scanner.nextLine();

90⏎Merhaba Java⏎ girdisinde sonuç Metin = [Merhaba Java] olur. Fakat sayı ve metin aynı satırdaysa, araya eklenen ilk nextLine() metni de atabilir. Bu nedenle “her nextInt() sonrasında mutlaka nextLine() ekle” evrensel bir kural değildir. nextLine() çağrısını tamamen kaldırmak da çözüm sayılmaz; bu kez okunması gereken metin hiç alınmaz.

nextInt(), next(), nextLine() ve hasNextInt() nasıl ayrılır?

Yöntem seçerken önce okumak istediğin birimi belirle: sayı tokenı mı, tek bir token mı, yoksa satırın tamamı mı? Bu yöntemlerin farkı, Scanner API'sindeki token ve satır okuma davranışlarından kaynaklanır.

Yöntem okuma birimi girdiyi tüketir mi boşluklarla ilişkisi uygun kullanım
nextInt() Sayısal bir token Evet, sayı tokenını tüketir; sonraki ayırıcı bu çağrıda kalabilir. Token sınırlarını ayırıcı düzeni belirler. Bir sayıyı doğrudan int olarak okumak
next() Boşluklarla ayrılmış tek token Evet, bulunan tokenı tüketir. Başta bulunan ayırıcıları atlar; boşluk içeren ifadeyi böler. Tek sözcük veya tek token okumak
nextLine() Mevcut satırın kalan metni Evet, satır ayırıcısına kadar ilerler. Boşlukları satırın parçası olarak okur. Ad, cümle veya boşluk içeren tam satır okumak
hasNextInt() Bir sonraki tokenın sayı olup olmadığı Hayır, yalnızca kontrol eder ve imleci ilerletmez. Kontrol token mantığıyla yapılır. nextInt() öncesinde sayı doğrulamak

hasNextInt() true döndürdüğünde ardından nextInt() çağrılabilir; kontrol sırasında imleç ilerlemediği için aynı token okunur.

Karar çerçevesi basittir: sayısal bir token için gerekirse hasNextInt() ile kontrol edip nextInt() kullan, tek sözcüklük bir token için next() seç, boşluk içerebilen tam bir satır için nextLine() kullan. Java'da bu ayrımı kısa sorularla pekiştirmek için Java bilgi testini çözebilirsin.

Ad ve puan alan program nasıl doğru biçimde yazılır?

Ad ve puan alan program nasıl doğru biçimde yazılır?

nextInt() puanın yalnızca sayı tokenını okur; nextLine() ise bulunduğu konumdan satır sonuna kadar ilerler. Puan satırında sayıdan sonra yalnızca Enter kaldığında, hemen çağrılan nextLine() boş dize döndürür.

Hatalı sürüm: adı doğrudan okumak

Bu örnekte puan ve ad ayrı satırlarda isteniyor. Aşağıdaki program derlenir, fakat ad isteminde beklemeden mevcut satırın kalanını okur:

import java.util.Scanner;

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

        System.out.print("Puan: ");
        int puan = scanner.nextInt();

        System.out.print("Ad: ");
        String ad = scanner.nextLine();

        System.out.println("Okunan ad: [" + ad + "]");
        System.out.println("Puan: " + puan);

        scanner.close();
    }
}

Puan olarak 85 ve ardından Enter verildiğinde okuma konumu 85|↵ şeklinde düşünülebilir. Dikey çizgi, nextInt() sonrasındaki okuma konumunu gösterir. nextLine() bu konumdan satır sonuna kadar kalan kısmı okur ve boş dize döndürür. Bu nedenle ad istemi görünür, fakat program bu istemde beklemez.

Hatalı sürümün konsol çıktısı:

Puan: 85
Ad: Okunan ad: []
Puan: 85

Bu akışta Ada Lovelace gibi sonraki satırdaki ad okunmadan kalır.

Düzeltilmiş sürüm: satır sonunu bilinçli tüketmek

Önce puan satırının kalanını, sonra adı ayrı satır olarak oku:

import java.util.Scanner;

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

        System.out.print("Puan: ");
        int puan = scanner.nextInt();

        scanner.nextLine(); // Puan satırındaki kalan kısmı tüketir.

        System.out.print("Ad: ");
        String ad = scanner.nextLine();

        System.out.println("Okunan ad: [" + ad + "]");
        System.out.println("Puan: " + puan);

        scanner.close();
    }
}

Buradaki ilk nextLine() genel bir temizleme komutu değildir. Puan ve adın ayrı satırlarda olduğu bu senaryoda, bilinen satır sonunu tüketen bilinçli bir adımdır. Puan satırında başka karakterler varsa dönen değer boş olmayabilir; bu yüzden bu çağrı her akışa otomatik olarak eklenmemelidir.

Düzeltilmiş sürümün konsol çıktısı:

Puan: 85
Ad: Ada Lovelace
Okunan ad: [Ada Lovelace]
Puan: 85

Geçersiz sayı girişi nasıl kontrol edilir ve akış nasıl toparlanır?

hasNextInt(), sıradaki tokenın int olarak okunup okunamayacağını kontrol eder. Sonuç false olduğunda Scanner konumunu ilerletmez. Bu nedenle geçersiz girdiyi nextLine() ile açıkça tüketmek ve ardından puanı yeniden istemek gerekir. Resmî Scanner API açıklaması da hasNextInt() kontrolünün girdiyi ilerletmediğini belirtir.

import java.util.Scanner;

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

        while (true) {
            System.out.print("Puan: ");

            if (scanner.hasNextInt()) {
                puan = scanner.nextInt();
                scanner.nextLine(); // Geçerli puan satırının kalanını tüketir.
                break;
            }

            scanner.nextLine(); // Geçersiz satırı tamamen tüketir.
            System.out.println("Geçersiz puan. Tam sayı gir.");
        }

        System.out.print("Ad: ");
        String ad = scanner.nextLine();

        System.out.println("Kayıt: " + ad + " / " + puan);

        scanner.close();
    }
}

abc satırında hasNextInt() false döner ve nextLine() bu satırı tüketir. 90 geldiğinde sayı nextInt() ile alınır, hemen sonraki çağrı puan satırının kalanını tüketir, son çağrı ise adı boşluklarıyla birlikte okur.

Geçersiz girişten geçerli girişe geçen örnek çıktı:

Puan: abc
Geçersiz puan. Tam sayı gir.
Puan: 90
Ad: Ada Lovelace
Kayıt: Ada Lovelace / 90

Kısa karar çerçevesi: Tek bir sayı tokenı ve ardından ayrı satırda ad varsa nextInt() ile birlikte bilinçli bir satır tüketimi kullan. Geçersiz sayı girişinde yeniden istemek gerekiyorsa hasNextInt() döngüsünü seç. Her alanın tamamını satır olarak doğrulamak istiyorsan, girdiyi nextLine() ile alıp sonradan dönüştürmek daha açık olabilir.

  • hasNextInt() false döndüğünde geçersiz girdiyi tüketmemek, döngünün aynı tokenı yeniden görmesine yol açar.
  • Her soruna körlemesine bir nextLine() eklemek, okuma konumunu yanlış yere taşıyabilir.
  • Boşluk içeren ad için next() kullanmak, adın yalnızca ilk kelimesini alır.
  • Girdinin token mı satır mı olduğunu belirlemeden yöntemleri karıştırmak, sonraki okumanın beklenmeyen bir konumdan başlamasına neden olabilir.

Lise ve Üniversite düzeyinde Java öğrenimini kişiye özel müfredat ve ödev takibiyle sürdürmek istersen, Java birebir özel ders programı hakkında bilgi edinebilirsin.

Sık Sorulan Sorular

next() kullanmak nextLine() boş okuma sorununu her durumda çözer mi?

Hayır. next() satırın tamamını değil, sonraki tokenı okur. Ada Lovelace gibi bir girişte yalnızca Ada alınır; kalan bölüm akışta kalabilir. next() bazı durumlarda boş okuma görüntüsünü ortadan kaldırsa da, boşluk içeren adları okumak için genel bir çözüm değildir.

nextLine() neden bazı örneklerde art arda iki kez çağrılır?

İki çağrının görevi farklıdır. İlk çağrı, nextInt() gibi token tabanlı bir okumadan sonra mevcut satırda kalan kısmı tüketir. İkinci çağrı ise sonraki satırdaki gerçek metni alır. İlk çağrı alışkanlıkla değil, gerçekten bilinen bir satır kalıntısı varsa kullanılmalıdır.

Tüm girdileri nextLine() ile okuyup sayıyı sonradan dönüştürmek daha uygun mudur?

Her alanın ayrı satır olduğu ve satırın tamamını doğrulamak istediğin akışlarda bu yaklaşım daha açık olabilir. Örneğin puanı önce String olarak alıp Integer.parseInt(puanMetni.trim()) ile dönüştürebilirsin. Sayı olmayan metinler için dönüşüm hatasını ayrıca ele almak gerekir. Token mantığıyla ilerleyen akışlarda ise nextInt() daha doğrudan olabilir.

Java konsol girişinde doğru akış, önce token ve satır sınırlarını belirlemek, sonra her yöntemi bu sınıra göre kullanmaktır.

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