המחלקה Scanner

מהי המחלקה Scanner?

Scanner היא מחלקה מובנית שמשמשת לקריאת קלט מהמשתמש (או מקבצים). זו הדרך הסטנדרטית לקבל מידע מהמשתמש בתוכנית Java.

ייבוא

Scanner נמצאת בחבילה java.util, אז צריך לייבא אותה:

import java.util.Scanner;

יצירת Scanner

Scanner scanner = new Scanner(System.in);

System.in הוא זרם הקלט הסטנדרטי (המקלדת).

קריאת סוגי נתונים

מחרוזת - מילה אחת

System.out.print("מה שמך? ");
String name = scanner.next();
System.out.println("שלום " + name);

next() קורא עד הרווח הראשון.

מחרוזת - שורה שלמה

System.out.print("הכנס משפט: ");
String line = scanner.nextLine();

nextLine() קורא עד סוף השורה (עד Enter).

מספר שלם

System.out.print("בן כמה אתה? ");
int age = scanner.nextInt();

מספר עשרוני

System.out.print("הכנס מחיר: ");
double price = scanner.nextDouble();

טיפוסים נוספים

long bigNumber = scanner.nextLong();
float floatNumber = scanner.nextFloat();
boolean flag = scanner.nextBoolean();

חשוב: סגירת ה-Scanner

אחרי שסיימת - סגור את ה-Scanner:

scanner.close();

דוגמה מלאה

import java.util.Scanner;

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

        System.out.print("מה שמך? ");
        String name = scanner.nextLine();

        System.out.print("בן כמה אתה? ");
        int age = scanner.nextInt();

        System.out.println("שלום " + name + "! אתה בן " + age);

        scanner.close();
    }
}

המלכודת הנפוצה: nextInt + nextLine

אחרי nextInt() (או כל next...() שאינו nextLine), מושאר תו \n בחוצץ. אם תקראו אחריו nextLine() - תקבלו מחרוזת ריקה!

int age = scanner.nextInt();
String name = scanner.nextLine();  // יקבל "" במקום את מה שרצית!

הפתרון

הוסיפו scanner.nextLine() כדי "לנקות" את החוצץ:

int age = scanner.nextInt();
scanner.nextLine();  // ניקוי החוצץ
String name = scanner.nextLine();  // עכשיו יעבוד

או פשוט להשתמש ב-nextLine() בלבד ולהמיר ידנית:

int age = Integer.parseInt(scanner.nextLine());
double price = Double.parseDouble(scanner.nextLine());

בדיקת קלט - hasNext

אפשר לבדוק אם יש עוד קלט לפני שמנסים לקרוא:

if (scanner.hasNextInt()) {
    int number = scanner.nextInt();
    System.out.println("מספר: " + number);
} else {
    System.out.println("לא הוכנס מספר תקין");
}

קריאה בלולאה

Scanner scanner = new Scanner(System.in);
System.out.println("הכנס מספרים (0 לסיום):");

int sum = 0;
while (true) {
    int number = scanner.nextInt();
    if (number == 0) break;
    sum += number;
}

System.out.println("הסכום: " + sum);
scanner.close();

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. אחרי nextInt() קוראים ל-nextLine() ומקבלים מחרוזת ריקה. למה?

    1. באג ב-Java
    2. nextInt לא קורא את ירידת השורה, ו-nextLine קורא אותה
    3. צריך לסגור את ה-Scanner
    4. המשתמש לא הקליד כלום
    הצגת התשובה

    תשובה ב. ה-Enter נשאר בחוצץ. פותרים עם nextLine() נוסף לפני הקריאה האמיתית.

  2. מה צריך כדי להשתמש ב-Scanner?

    1. import java.util.Scanner
    2. שום דבר, הוא תמיד זמין
    3. import java.io.Scanner
    4. להתקין ספרייה
    הצגת התשובה

    תשובה א. Scanner נמצא בחבילה java.util וצריך לייבא אותו.