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.
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:

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.