Pri poskusu uporabe metode nextLine() iz java.util.Scanner imam težave.
Poskusil sem naslednje:
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);
}
}
Primer #1: Ta primer deluje, kot je bilo predvideno. Vrstica String sentence = scanner.nextLine();
čaka na vnos, preden nadaljuje z System.out.print("Enter an index:\t");
.
To ustvari izpis:
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;
}
}
}
}
Primer #2: Ta primer ne deluje, kot je bilo predvideno. Ta primer uporablja zanko while in strukturo if - else, ki uporabniku omogoča, da izbere, kaj naj stori. Ko program pride do String sentence = scanner.nextLine();
, ne počaka na vnos, temveč izvede vrstico System.out.print("Enter an index:\t");
.
To ustvari izpis:
Menu Options
(1) - do this
(2) - quit
Please enter your selection: 1
Enter a sentence: Enter an index:
To onemogoča vnos stavka.
Zakaj primer #2 ne deluje, kot je bilo predvideno? Edina razlika med primeroma 1 in 2 je, da ima primer 2 zanko while in strukturo if-else. Ne razumem, zakaj to vpliva na obnašanje funkcije scanner.nextInt().
Mislim, da je vaša težava v tem, da
int selection = scanner.nextInt();
prebere samo številko, ne pa tudi konca vrstice ali česar koli za številko. Ko izjavite
String sentence = scanner.nextLine();
To prebere preostanek vrstice s številko (domnevam, da za številko ni ničesar).
Če nameravate prezreti preostanek vrstice, poskusite za vsako funkcijo nextInt() vstaviti scanner.nextLine();.
Namesto da vsakič, ko želite nekaj prebrati, vstavite dodatno scanner.nextLine()
, ker se zdi, da želite sprejeti vsak vnos v novi vrstici, boste morda raje spremenili ločilo, da se dejansko ujema samo z novimi vrsticami (namesto s katerim koli belim presledkom, kot je privzeto).
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);
}
}
Tako za branje vhodne vrstice potrebujete le scanner.next()
, ki se obnaša enako kot next{Int, Double, ...}, kar zadeva razmejitev.
Razlika s pristopom "nextLine() vsakič" je v tem, da bo slednji kot indeks sprejel tudi <space>3
, 3<space>
in 3<space>karkoli
, medtem ko prvi sprejme samo 3
v samostojni vrstici