LÄR DIG JAVA

Klassen Scanner i Java - Inputs till programmet


Klassen java.util.Scanner är en standardklass i Java och används för att kunna läsa av inputs av primitiva datatyper. Det är det enklaste sättet att läsa av information som användaren ger till programmet.

Hur ger man ett värde som input till sitt program i Java?

Ibland vill man skicka in värden eller tal till sitt program. Det kanske är en inmatning av vad du heter, eller antal produkter som någon har köpt i en affär. Vi kan använda Javas inbyggda klass Scanner för att hantera dessa input. Scanner kan exempelvis läsa text från terminalen, filer och strängar. En grafisk textruta behöver hanteras med GUI-bibliotekets metoder.

Vi kan använda Javas inbyggda klass Scanner för att hantera input från användaren.

Scanner i Java
Scanner i Java

Hur använder man klassen Scanner i Java?

Scanner kan läsa text från exempelvis terminalen, en fil eller en sträng. next() läser nästa token, som normalt avgränsas av blanktecken. nextLine() läser resten av raden.

Syntax för Scanner i Java

import java.util.Scanner;

Scanner input = new Scanner(System.in);

  • Det vill säga, först importera klassen Scanner från biblioteket java.util.
  • Sedan så har vi skapat ett scanner-objekt som vi gett namnet input (det går självklart välja ett annat namn också).
  • Notera att vi också behöver skriva System.in inom parentesen för att kunna läsa av input.

Skapa en Scanner i Java

Om vi ska skriva det i kodeditorn så blir det först att vi importerar biblioteket.

import java.util.Scanner;

Vidare, vi behöver också skapa ett scanner-objekt. I senare kapitel kommer vi gå igenom vad klasser och objekt är men för tillfället nöjer vi oss med att lära oss hur vi kan ta in information från användaren med hjälp av ett scanner-objekt.

import java.util.Scanner; // Importera klassen scanner 

Scanner input = new Scanner(System.in); // Skapa ett scanner-objekt som hanterar input

Vi har nu skapat ett scanner-objekt som vi gett namnet input (det går självklart välja ett annat namn också). Notera att vi också behöver skriva System.in inom parentesen för att kunna läsa av input.

Exempel - Klassen Scanner i Java

Om nextInt anropas när nästa token inte kan tolkas som en int kastas InputMismatchException. Kontrollera med hasNextInt eller hantera undantaget. Det är läsmetoden, inte användaren, som bestämmer vilken typ programmet försöker läsa.

Vi testar med ett exempel!

  • Först så skapar vi ett enkelt program som ska fråga användaren om två heltal
  • Sedan addera de två talen
  • Slutligen skriva ut svaret.

Vi antar att användaren vet att det endast går bra med heltal och att användaren anger rätt.

import java.util.Scanner;  // Importerar klassen Scanner

public class Scanner_exempel {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.println("Ange första talet: ");
        int first = input.nextInt();                // Sparar ned första talet

        System.out.println("Ange andra talet: ");
        int second = input.nextInt();              // Sparar ned andra talet

        // Skriver ut första, andra och första + andra talet
        System.out.println(first + " + " + second + " = " + (first+second));
    }
}

Programmet kommer i detta fall fråga om det första talet och vänta tills dess att användaren har skickat inputen. Därav, när första inputen är inskickad frågar Scanner efter det andra talet och väntar till dess att användaren har skrivit in talet. När båda talen är inskickade så skriver programmet ut svaret.

Observera vad som händer om man skickar in text, istället för ett tal:

Exempel på hur man använder scanner i java

Hantera rätt datatyp som input

Vidare, det är alltså viktigt att ange vilken datatyp som användaren kommer mata in, annars kommer Scanner inte kunna hantera datan. Nedan visas hur scanner hanterar varje datatyp.

Tal

Metod Info Exempel
int nextInt() Sparar ned nästa input som en int,
får ett fel om det inte är en int.
input.nextInt();
double nextDouble() Sparar ned nästa input som en double,
får ett fel om det inte är en double.
input.nextDouble();

Tecken

Metod Info Exempel
String next() Returnerar nästa token som en String. input.next();
String nextLine() Returnerar nästa rad som en String input.nextLine();

Sant eller Falskt (Booleans)

Metod Info Exempel
boolean hasNext() Returnerar true om det finns något
mer att hämta, annars false. 
input.hasNext();
boolean hasNextInt() Returnerar true om det som står på tur
att behandlas kan tolkas som ett heltal
(int), annars false
input.hasNextInt();
boolean hasNextDouble() Returnerar true om det som står på tur
att behandlas kan tolkas som ett
decimaltal (double), annars false
input.hasNextDouble();

För vidare information hur klassen scanner fungerar så rekommenderar vi Oracle hemsida 

Vanliga fallgropar

nextInt() kan lämna radbrytningen kvar, så ett direkt följande nextLine() kan ge en tom sträng. Läs resten av raden först eller läs hela rader och tolka dem. hasNextInt() kontrollerar nästa token utan att konsumera den. Ogiltig inmatning kan ge InputMismatchException. Decimalseparatorn beror på Scannerns locale; välj en uttrycklig locale om programmet ska kräva punkt eller komma.