Scanner gebruiken. Naartoestel ()

Ik heb problemen ondervonden tijdens het proberen de methode van de next () van Java.Util.Scanner te gebruiken.

Hier is wat ik heb geprobeerd:

import java.util.Scanner;
class TestRevised {
    public void menu() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter a sentence:\t");
        String sentence = scanner.nextLine();
        System.out.print("Enter an index:\t");
        int index = scanner.nextInt();
        System.out.println("\nYour sentence:\t" + sentence);
        System.out.println("Your index:\t" + index);
    }
}

Voorbeeld # 1: Dit voorbeeld werkt zoals bedoeld. De regel String sentence = scanner.nextLine();Wacht op ingevoerde invoer voordat u verdergaat voordat u doorgaat op System.out.print("Enter an index:\t");.

Dit levert de uitvoer op:

Enter a sentence:   Hello.
Enter an index: 0
Your sentence:  Hello.
Your index: 0

// Example #2
import java.util.Scanner;
class Test {
    public void menu() {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("\nMenu Options\n");
            System.out.println("(1) - do this");
            System.out.println("(2) - quit");
            System.out.print("Please enter your selection:\t");
            int selection = scanner.nextInt();
            if (selection == 1) {
                System.out.print("Enter a sentence:\t");
                String sentence = scanner.nextLine();
                System.out.print("Enter an index:\t");
                int index = scanner.nextInt();
                System.out.println("\nYour sentence:\t" + sentence);
                System.out.println("Your index:\t" + index);
            }
            else if (selection == 2) {
                break;
            }
        }
    }
}

Voorbeeld #2:Dit voorbeeld werkt niet zoals bedoeld. In dit voorbeeld wordt een while-lus en en als – else-structuur gebruikt, zodat de gebruiker kan kiezen wat hij moet doen. Zodra het programma bij String sentence = scanner.nextLine();komt, wacht het niet op invoer, maar voert het in plaats daarvan de regel uit System.out.print("Enter an index:\t");.

Dit levert de uitvoer op:

Menu Options
(1) - do this
(2) - quit
Please enter your selection:    1
Enter a sentence:   Enter an index: 

Wat het onmogelijk maakt om een zin in te voeren.


Waarom werkt voorbeeld #2 niet zoals bedoeld? Het enige verschil tussen Ex. 1 en 2 is dat Ex. 2 heeft een while-lus en een if-else structuur. Ik begrijp niet waarom dit het gedrag van scanner.nextInt() beïnvloedt.


Antwoord 1, autoriteit 100%

Ik denk dat jouw probleem is dat

int selection = scanner.nextInt();

lees alleen het nummer, niet het einde van de regel of iets na het nummer. Wanneer u declareert

String sentence = scanner.nextLine();

Hiermee wordt de rest van de regel gelezen met het nummer erop (met niets na het nummer vermoed ik)

Probeer een scanner.nextLine(); na elke nextInt() als u van plan bent de rest van de regel te negeren.


Antwoord 2, autoriteit 17%

In plaats van elke keer dat u iets wilt lezen een extra scanner.nextLine()te plaatsen, aangezien het lijkt alsof u elke invoer op een nieuwe regel wilt accepteren, kunt u in plaats daarvan het scheidingsteken wijzigen om daadwerkelijk alleen nieuwe regels te matchen (in plaats van een witruimte, zoals standaard is)

import java.util.Scanner;
class ScannerTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.useDelimiter("\\n");
        System.out.print("Enter an index: ");
        int index = scanner.nextInt();
        System.out.print("Enter a sentence: ");
        String sentence = scanner.next();
        System.out.println("\nYour sentence: " + sentence);
        System.out.println("Your index: " + index);
    }
}

Dus, om een invoerregel te lezen, heb je alleen scanner.next()nodig die hetzelfde gedrag heeft als scheidingsteken van next{Int, Double, …}

Het verschil met de “nextLine() every time”-benadering is dat deze laatste als index ook <space>3, 3<space>en 3<space>whateverterwijl de eerste alleen 3accepteert op een aparte regel


Antwoord 3, autoriteit 9%

Het is omdat wanneer u een getal invoert en vervolgens op Enter drukt, input.nextInt()alleen het getal gebruikt, niet het “einde van de regel”. Primitieve datatypes zoals int, double etc verbruiken geen “end of line”, daarom blijft de “end of line” in de buffer en wanneer input.next()wordt uitgevoerd, verbruikt het de “end of line” ” uit de buffer vanaf de eerste invoer. Daarom gebruikt uw String sentence = scanner.next()alleen het “einde van de regel” en wacht niet om vanaf het toetsenbord te lezen.

TIP: Gebruik scanner.nextLine()in plaats van scanner.next()omdat scanner.next()leest geen witte ruimtes van het toetsenbord. (De snaar afkappen na het geven van wat ruimte van het toetsenbord, alleen tonen string vóór de ruimte.)


Antwoord 4, Autoriteit 7%

Probeer geen tekst te scannen met de nextline (); Na gebruik van Nextint () met dezelfde scanner! Het werkt niet goed met Java-scanner en er kiezen veel Java-ontwikkelaars om gewoon een andere scanner voor gehele getallen te gebruiken. U kunt deze scanners scannen1 en scan2 noemen als u wilt.


Antwoord 5, Autoriteit 3%

of

int selection = Integer.parseInt(scanner.nextLine());

Other episodes