Yazılım geliştirme sürecinde dinamik ve etkileşimli programlar oluşturmanın temel adımı, kullanıcıdan girdi alabilmektir. Java programlama dilinde konsol tabanlı uygulamalar geliştirirken dışarıdan veri okumak için farklı yöntemler bulunsa da en pratik ve esnek çözüm Scanner sınıfını kullanmaktır. Bu rehberde, Java’da Scanner sınıfının çalışma mantığını, sık kullanılan metotlarını ve bu işlemler sırasında dikkat edilmesi gereken teknik detayları ele alacağız.
Java Scanner Sınıfı Nedir?
Scanner, Java’nın standart kütüphanesinde yer alan java.util paketine dahil edilmiş gelişmiş bir girdi okuma sınıfıdır. Klavyeden girilen ham metin akışını ayrıştırarak (parsing) tamsayı, ondalıklı sayı veya metin gibi temel veri türlerine doğrudan dönüştürme yeteneğine sahiptir.
Geleneksel veri okuma araçları (örneğin BufferedReader) girdileri yalnızca düz metin olarak okurken, Scanner sınıfı regex (düzenli ifadeler) kullanarak veriyi belirli sınırlayıcılara (varsayılan olarak boşluk karakteri) göre parçalar. Bu durum, veri tipi dönüşümleri için ek kod yazma ihtiyacını ortadan kaldırır.
Scanner Sınıfının Kurulumu ve Nesne Oluşturma
Scanner sınıfını kullanabilmek için öncelikle ilgili sınıfı Java kaynak dosyasına dahil etmek gerekir. Bunun ardından standart girdi akışını (klavye) temsil eden System.in parametresi ile bir nesne türetilmelidir.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner girdi = new Scanner(System.in);
}
}
Yukarıdaki kod bloğunda ilk satır, Scanner sınıfını projeye dahil eder. Main metodu içerisinde yer alan ifade ise sistemin standart girdi akışını dinleyen “girdi” adında yeni bir Scanner referansı oluşturur.
Temel Scanner Metotları
Scanner sınıfı, farklı veri tiplerini okuyabilmek için özelleştirilmiş birçok metoda sahiptir. Yaygın olarak kullanılan metotlar şunlardır:
- nextLine(): Kullanıcının girdiği satırın tamamını bir String olarak okur. Enter tuşuna basılana kadar yazılan tüm karakterleri ve boşlukları dahil eder.
- next(): Boşluk karakterine (space, tab, yeni satır) kadar olan ilk kelimeyi String olarak alır.
- nextInt(): Konsoldan girilen değeri tamsayı (int) formatında okur.
- nextDouble(): Girilen değeri çift duyarlıklı ondalıklı sayı (double) formatında okur. Bölgesel ayarlara bağlı olarak virgül veya nokta kullanımına dikkat edilmelidir.
- nextBoolean(): Yalnızca “true” veya “false” değerlerini mantıksal veri tipi olarak okur.
Kullanıcıdan Veri Alma Uygulaması
Aşağıdaki örnekte kullanıcıdan ad, soyad, yaş ve not ortalaması bilgilerini alarak bunları biçimlendirilmiş şekilde ekrana yazdıran basit bir konsol programı yer almaktadır.
import java.util.Scanner;
public class BilgiAlma {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Adınızı ve Soyadınızı giriniz: ");
String adSoyad = scanner.nextLine();
System.out.print("Yaşınızı giriniz: ");
int yas = scanner.nextInt();
System.out.print("Genel not ortalamanızı giriniz: ");
double ortalama = scanner.nextDouble();
System.out.println("--- Kullanıcı Bilgileri ---");
System.out.println("Ad Soyad: " + adSoyad);
System.out.println("Yaş: " + yas);
System.out.println("Ortalama: " + ortalama);
scanner.close();
}
}
Bu örnekte Scanner nesnesi başlatıldıktan sonra her bir veri türü için uygun metot çağrılmıştır. Program sonunda scanner.close() metodu ile sistem kaynaklarının boşa harcanmaması adına açık olan veri akışı kapatılmıştır.
Scanner Kullanırken Karşılaşılan Yaygın Sorunlar
Scanner sınıfı kolay bir kullanıma sahip olsa da yeni başlayan geliştiricilerin sıklıkla karşılaştığı bazı mantıksal ve çalışma zamanı hataları barındırır.
Sayısal Girdilerden Sonra Satır Atlama Sorunu
En sık rastlanan problem, nextInt() veya nextDouble() gibi sayısal okuma metotlarından sonra nextLine() metodunun çağrılması durumunda ortaya çıkar. Sayısal metotlar yalnızca verinin kendisini okur; kullanıcının girdiyi tamamlamak için bastığı Enter (yeni satır karakteri: n) karakterini girdi akışında (buffer) bırakır.
Hemen ardından çağrılan nextLine(), akışta bekleyen bu boş satır karakterini okur ve kullanıcıdan yeni bir girdi beklemeden doğrudan boş bir değer döndürerek bir sonraki adıma geçer.
System.out.print("Yaşınızı giriniz: ");
int yas = scanner.nextInt();
scanner.nextLine(); // Buffer içerisinde kalan boş satır karakterini temizler
System.out.print("Şehrinizi giriniz: ");
String sehir = scanner.nextLine();
Bu sorunu çözmek için sayısal veri okunduktan hemen sonra boş bir scanner.nextLine() çağrısı yapılarak tampon bellek temizlenmelidir.
Veri Tipi Uyuşmazlığı (InputMismatchException)
Kullanıcıdan beklenen veri türü ile girilen verinin uyuşmaması durumunda Java, çalışma zamanında InputMismatchException hatası fırlatır. Örneğin nextInt() beklenen bir alana harf girilmesi bu hataya yol açar.
Bu tür çökmelerin önüne geçebilmek için kontrol metotları kullanılabilir:
- hasNextInt(): Akıştaki bir sonraki girdinin tamsayı olup olmadığını kontrol eder, geriye boolean döner.
- hasNextDouble(): Bir sonraki girdinin ondalıklı sayı olup olmadığını denetler.
System.out.print("Lütfen bir sayı giriniz: ");
if (scanner.hasNextInt()) {
int sayi = scanner.nextInt();
System.out.println("Girdiğiniz sayı: " + sayi);
} else {
System.out.println("Hata: Geçerli bir tamsayı girmediniz.");
}
Kontrollü veri okuma yaklaşımı, programın beklenmeyen kullanıcı girişlerine karşı daha dirençli olmasını sağlar.
Scanner Akışını Kapatmak
Scanner nesnesiyle işiniz bittiğinde close() metodunu çağırmak, işletim sistemi kaynaklarının doğru yönetilmesi açısından iyi bir programlama pratiğidir. Ancak System.in akışı üzerinden açılan bir Scanner nesnesi kapatıldığında, standart girdi akışı da kapanır. Aynı program içerisinde System.in üzerinden yeni bir Scanner açmaya çalışmak hata verir. Bu nedenle Scanner’ı kapatma işlemini genellikle programın veya metodun tamamen sonlandığı noktalarda yapmanız önerilir.
Özet ve Sonraki Adımlar
Java’da Scanner sınıfı, klavyeden kullanıcı girdisi almak için zengin metot desteği sunan, öğrenmesi kolay ve esnek bir araçtır. Doğru veri tipi metodunu seçmek, buffer temizliğine dikkat etmek ve olası tip uyuşmazlıklarını denetlemek sağlıklı çalışan konsol uygulamaları geliştirmenin anahtarıdır.
Bir sonraki adım olarak kullanıcıdan alınan verilerin hata kontrolünü try-catch bloklarıyla yönetmeyi öğrenebilir veya yüksek boyutlu metin okuma operasyonlarında performans avantajı sağlayan BufferedReader sınıfını inceleyebilirsiniz.


Comments
No comments yet. Write the first comment.