Java Scanner ile kullanıcıdan sayı ve metin almak için önce Scanner nesnesini System.in ile oluşturur, ardından girdinin türüne uygun olarak nextInt(), nextDouble(), next() veya nextLine() yöntemini kullanırsın. Seçim, girdinin tam sayı, ondalıklı sayı, boşluk içermeyen tek token ya da satırın tamamı olmasına göre yapılır; tür kontrolü gerektiğinde hasNextInt() ve hasNextDouble() gibi yöntemler okuma öncesinde kullanılabilir.
Java Scanner nesnesi nasıl oluşturulur ve temel kullanım nedir?
Scanner sınıfını kullanmak için önce java.util.Scanner paketini içe aktarman gerekir. Ardından Scanner scanner = new Scanner(System.in); satırıyla, konsoldan gelen standart girdiyi okuyacak nesneyi oluşturursun. Bu nesne sayesinde kullanıcıdan metin, tam sayı veya ondalıklı sayı alabilir ve sonucu uygun Java veri türünde saklayabilirsin.
import java.util.Scanner;
public class ScannerTemel {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Adın: ");
String ad = scanner.nextLine();
System.out.print("Ders sayısı: ");
int dersSayisi = scanner.nextInt();
System.out.println(ad + " için ders sayısı: " + dersSayisi);
scanner.close();
}
}
Örnek giriş:
Elif
4
Beklenen çıktı:
Adın: Elif
Ders sayısı: 4
Elif için ders sayısı: 4
Bu örnekte nextLine() kullanıcının yazdığı adı metin olarak, nextInt() ise ders sayısını tam sayı olarak okur. Scanner, konsol girişini kendisi üretmez; System.in üzerinden gelen veriyi okuyup programın kullanabileceği değerlere dönüştürür.
Java öğrenirken giriş alma konusunu döngüler, koşullar ve hata ayıklama gibi başlıklarla birlikte uygulamak istersen birebir Java özel ders programı hakkında bilgi edinebilirsin.
Bağımsız bir konsol programında bütün okumalar bittikten sonra scanner.close() çağırmak uygundur. Scanner kapatıldığında, kullandığı giriş kaynağı da Closeable ise kapatılır. System.in bir InputStream olduğu için Scanner'ı erken kapatmak, programın daha sonraki System.in okumalarını etkileyebilir. Bu nedenle close() çağrısını son okuma işleminden sonra yapmalısın.
nextInt, nextDouble, next, nextLine ve hasNext yöntemleri nasıl seçilir?

Scanner, girdiyi varsayılan olarak boşluk karakterlerine göre tokenlara ayırır. next() boşlukta durur, nextLine() satırın kalanını okur. hasNext() yalnızca bir sonraki tokenın bulunup bulunmadığını kontrol eder, veri türünü doğrulamaz. Tür kontrolü için hasNextInt() veya hasNextDouble() gibi yönteme özel kontroller seçilir. Bu kontrolleri tüm giriş akışının garantisi olarak değil, o andaki okuma adımını yönlendiren bir kontrol olarak düşünmek gerekir; konsol girdisinde yöntemler yeni veri bekleyebilir.
Tek bakışta karar çerçevesi şöyledir: boşluk içeren metin için nextLine(), tek token için next(), tam sayı için önce hasNextInt() sonra nextInt(), ondalıklı sayı için önce hasNextDouble() sonra nextDouble(), yalnızca bir sonraki tokenın varlığını görmek için hasNext() kullanılır.
| Girdi ihtiyacı | Kullanılacak yöntem | Okuma sınırı | Dikkat edilmesi gereken nokta |
|---|---|---|---|
| Tam sayı | hasNextInt(), ardından nextInt() |
Bir sonraki token | Sayı olmayan token doğrudan okunursa InputMismatchException oluşabilir. |
| Ondalıklı sayı | hasNextDouble(), ardından nextDouble() |
Bir sonraki token | Tokenın double olarak yorumlanabilir olup olmadığını önce kontrol edebilirsin. |
| Boşluk içermeyen tek parça | next() |
Bir sonraki ayırıcıya kadar | Metin boşluk içeriyorsa yalnızca ilk parça okunur. |
| Satırın tamamı | nextLine() |
Satır sonuna kadar | Satırdaki boşluklar korunur; önceki sayısal okumadan kalan satır sonu ayrıca ele alınmalıdır. |
| Bir sonraki tokenın varlığı | hasNext() |
Okuma yapmadan sonraki tokenı kontrol eder | Veri türünü doğrulamaz; gerektiğinde tür özelindeki kontrolü kullanmalısın. |
Sayısal girişten sonra nextLine nasıl doğru kullanılır?

Scanner varsayılan olarak boşluk, sekme ve satır sonunu token ayırıcı kabul eder. nextInt() veya nextDouble() sayısal tokenı okur, ancak bulunduğu satırın kalanını tüketmez. next() boşlukta durur, nextLine() satırın kalanını okur. nextLine() satır sonunu geçer fakat onu döndürdüğü metne eklemez.
Sayıyı ayrı bir satıra girdiğinde, hemen ardından çağrılan nextLine() genellikle boş metin döndürür; çünkü sayının bulunduğu satırda okunacak başka metin kalmamıştır. Ders adı bir sonraki satırdaysa okuma sırası şöyle kurulur:
int dersSayisi = giris.nextInt();
giris.nextLine(); // Sayının bulunduğu satırın kalanını geç
String dersAdi = giris.nextLine(); // Sonraki satırdaki ders adını oku
Bu sıra, sayı ile ders adının ayrı satırlarda girileceğini varsayar. Aynı satıra 36 Java Programlama yazılırsa ilk nextLine(), Java Programlama bölümünü okur. Böyle bir girişe izin veriyorsan kalan metni atma; ders adını o değerden alacak biçimde okuma sırasını değiştir.
Ders adı, ders sayısı ve not alan çalışan Java programı
Aşağıdaki program ders sayısını, boşluk içerebilen ders adını ve notu ayrı satırlardan alır. Locale.US seçimi, örnekteki 87.5 değerinin noktalı ondalık gösterimle okunması içindir. hasNextInt() ve hasNextDouble(), ilgili değeri okumadan önce sıradaki tokenın uygun sayısal türde yorumlanıp yorumlanamayacağını kontrol eder.
import java.util.Locale;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
try (Scanner giris = new Scanner(System.in)) {
giris.useLocale(Locale.US);
System.out.println("Ders sayısını gir:");
if (!giris.hasNextInt()) {
System.out.println("Hata: Ders sayısı tam sayı olmalı.");
return;
}
int dersSayisi = giris.nextInt();
giris.nextLine();
System.out.println("Ders adını gir:");
String dersAdi = giris.nextLine();
System.out.println("Notu gir:");
if (!giris.hasNextDouble()) {
System.out.println("Hata: Not sayı olarak girilmeli.");
return;
}
double not = giris.nextDouble();
System.out.println("Sonuç: " + dersAdi + ", "
+ dersSayisi + " ders, not " + not);
}
}
}
Örnek giriş satırları sırasıyla 36, Java Programlama ve 87.5 şeklindedir. Girdi satırları hariç, programın yazdırdığı beklenen çıktı:
Ders sayısını gir:
Ders adını gir:
Notu gir:
Sonuç: Java Programlama, 36 ders, not 87.5
Bu kontroller yalnız sayısal türü sınar; ders adının boş olup olmadığını veya notun beklenen aralıkta bulunup bulunmadığını doğrulamaz. try bloğu bittiğinde Scanner kapanır ve bağlı olduğu System.in de kapanır. Bu düzen, örnekte olduğu gibi programın daha sonra konsoldan giriş almayacağı durum için uygundur.
Geçersiz girişleri nasıl kontrol eder ve doğru okuma sırasını nasıl seçersin?
Geçersiz girişleri yönetmenin temel yolu, okuyacağın verinin satır mı yoksa tek bir token mı olduğunu belirleyip dönüşümden önce uygun kontrolü yapmaktır. Uygulama öncesinde şu sırayı kontrol edebilirsin:
- Veri boşluk içerebiliyorsa
nextLine()kullan. - Veri tek bir token ise
next()kullan. - Beklenen değer tam sayıysa önce
hasNextInt(), ardındannextInt()kullan. - Beklenen değer ondalıklı sayıysa önce
hasNextDouble(), ardındannextDouble()kullan.
hasNextInt() ve hasNextDouble(), sıradaki tokenın ilgili sayısal yöntemin anlayabileceği biçime uygun olup olmadığını kontrol etmeye yardımcı olur. Ancak bu kontrolleri programın tüm kurallarını doğrulayan kesin bir sonuç veya garanti gibi görme. Sayının izin verilen aralıkta olması, boş bırakılmaması ya da uygulamaya özgü başka koşulları karşılaması ayrıca denetlenebilir.
Bir hasNext kontrolü başarısız olduğunda Scanner giriş konumunu ilerletmez. Döngü içinde yalnızca aynı kontrolü tekrarlarsan geçersiz token yerinde kalır ve program aynı durumu yeniden görür. Bu nedenle geçersiz tokenı, veri akışına uygun biçimde next() veya nextLine() ile tüketip kontrolü yeniden yapmalısın.
Tüm okumalar tamamlandıktan sonra scanner.close() çağırılır. Scanner kapanırken alttaki kaynak kapatılabilir ve kapatılmış Scanner ile yeni okuma işlemi yapılamaz. Bu yüzden kapatma işlemini veri alma sürecinin ortasında değil, son okumanın ardından yapmalısın.
Java temel kavramlarını kendi seviyende kontrol etmek için ücretsiz Java bilgi testi çözerek hangi konuları tekrar etmen gerektiğini görebilirsin.
Sık Sorulan Sorular
nextInt() sonrasında nextLine() neden boş bir metin döndürebilir?
nextInt() sayısal tokenı okur, nextLine() ise geçerli satırın kalan kısmını döndürür. Sayısal değerden sonra satırda yalnızca satır sonu kaldıysa nextLine() boş bir metin verir.
next() ile nextLine() arasındaki temel fark nedir?
next() boşlukta durur, nextLine() satırın kalanını okur. Bu nedenle next() tek kelime veya token, nextLine() ise boşluk içerebilen metinler için uygundur.
hasNextInt() ile nextInt() arasındaki fark nedir?
hasNextInt(), sıradaki tokenın tam sayı olarak yorumlanıp yorumlanamayacağını kontrol eder ve giriş konumunu ilerletmez. nextInt() ise değeri okumaya ve dönüştürmeye çalışır; başarılı olduğunda tokenı tüketir, uyumsuz girişte hata oluşturabilir.
Scanner ne zaman kapatılmalıdır?
Scanner, programın onunla yapacağı tüm okumalar tamamlandıktan sonra kapatılmalıdır. Kapatıldıktan sonra yeni arama veya okuma işlemleri yapılamaz; bu nedenle close() çağrısını son okumadan önce kullanmamalısın.
Doğru okuma yöntemini seçip geçersiz tokenı tüketerek ilerlediğinde, Scanner ile kullanıcıdan veri alan programların daha düzenli çalışmasını sağlayabilirsin.