Saya telah mengalami masalah ketika mencoba untuk menggunakan nextLine() method dari jawa.util.Scanner.
Berikut adalah apa yang saya coba:
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);
}
}
Contoh #1: contoh Ini bekerja sebagaimana dimaksud. Garis String kalimat = scanner.nextLine();
menunggu input yang akan dimasukkan sebelum melanjutkan ke Sistem.keluar.print("Masukkan indeks:\t");
.
Ini menghasilkan output:
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;
}
}
}
}
Contoh #2: contoh Ini tidak bekerja sebagaimana dimaksud. Contoh ini menggunakan while dan if - else struktur untuk memungkinkan pengguna untuk memilih apa yang harus dilakukan. Setelah membuat program untuk String kalimat = scanner.nextLine();
, itu tidak menunggu masukan tapi malah mengeksekusi baris Sistem.keluar.print("Masukkan indeks:\t");
.
Ini menghasilkan output:
Menu Options
(1) - do this
(2) - quit
Please enter your selection: 1
Enter a sentence: Enter an index:
Yang membuat tidak mungkin untuk memasukkan sebuah kalimat.
Mengapa contoh #2 tidak bekerja seperti yang dimaksudkan? Satu-satunya perbedaan antara Ex. 1 dan 2 adalah Ex. 2 memiliki while dan if-else struktur. Saya don't mengerti mengapa ini mempengaruhi perilaku scanner.nextInt().
Saya pikir masalahnya adalah bahwa
int selection = scanner.nextInt();
membaca hanya jumlah, bukan akhir dari baris atau apa-apa setelah nomor. Ketika anda menyatakan
String sentence = scanner.nextLine();
Ini berbunyi sisa line dengan nomor di atasnya (dengan apa-apa setelah nomor saya menduga)
Cobalah menempatkan scanner.nextLine(); setelah masing-masing nextInt() jika anda berniat untuk mengabaikan seluruh baris.
Daripada menempatkan tambahan scanner.nextLine()
setiap kali anda ingin membaca sesuatu, karena tampaknya anda ingin menerima setiap masukan pada baris baru, anda mungkin ingin bukannya mengubah pembatas untuk benar-benar pertandingan hanya baris baru (bukan spasi, seperti default)
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);
}
}
Dengan demikian, untuk membaca satu baris dari input, anda hanya perlu scanner.next()
yang memiliki perilaku yang sama pembatas-bijak depan{Int, Double, ...}
Perbedaan dengan "nextLine() setiap waktu" pendekatan, adalah bahwa orang akan menerima, sebagai indeks juga <spasi>3
, 3<spasi>
dan 3<spasi>apapun
sementara mantan hanya menerima 3
pada baris sendiri
It's karena ketika anda memasukkan nomor, kemudian tekan Enter, input.nextInt()
hanya mengkonsumsi jumlah, bukan "akhir dari garis". Primitif tipe data seperti int, double, dll tidak mengkonsumsi "akhir dari garis", oleh karena itu "akhir dari garis" tetap dalam buffer dan Ketika input.next()
mengeksekusi, mengkonsumsi "akhir dari garis" dari buffer dari input pertama. Yang's mengapa, anda String kalimat = scanner.next()
hanya mengkonsumsi "akhir dari garis" dan tidak sabar untuk membaca dari keyboard.
Tip: gunakan scanner.nextLine()
bukan scanner.next()
karena scanner.next()
tidak membaca spasi dari keyboard. (Memotong string setelah memberikan beberapa ruang dari keyboard, hanya menampilkan string sebelum ruang.)
Don't mencoba untuk memindai teks dengan nextLine(); SETELAH menggunakan nextInt() sama dengan scanner! Itu doesn't bekerja dengan baik dengan Java Scanner, dan Jawa banyak pengembang memilih untuk hanya menggunakan Scanner untuk bilangan bulat. Anda dapat menghubungi scanner ini scan1 dan scan2 jika anda ingin.