java.util.Scanner의 nextLine() 메서드를 사용하려고 시도하는 동안 문제가 발생했습니다.
다음은 내가 시도한 것입니다:
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);
}
}
예제 #1: 이 예제는 의도한 대로 작동합니다. 문자열 문장 = 스캐너.nextLine();줄은 입력이 입력될 때까지 기다렸다가
System.out.print("색인 입력:\t");`로 계속 진행합니다.
그러면 출력이 생성됩니다:
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;
}
}
}
}
예제 #2: 이 예제는 의도한 대로 작동하지 않습니다. 이 예제에서는 사용자가 수행할 작업을 선택할 수 있도록 while 루프와 if - else 구조를 사용합니다. 프로그램이 String sentence = scanner.nextLine();
에 도달하면 입력을 기다리지 않고 System.out.print("색인 입력:\t");
행을 실행합니다.
그러면 출력이 생성됩니다:
Menu Options
(1) - do this
(2) - quit
Please enter your selection: 1
Enter a sentence: Enter an index:
문장을 입력할 수 없습니다.
예제 2가 의도한 대로 작동하지 않는 이유는 무엇인가요? 예제 1과 예제 2의 유일한 차이점은 예제 2에 while 루프와 if-else 구조가 있다는 것입니다. 이것이 스캐너.nextInt()의 동작에 영향을 미치는 이유를 이해할 수 없습니다.
제 생각에 문제는
int selection = scanner.nextInt();
는 숫자만 읽고 줄 끝이나 숫자 뒤의 내용은 읽지 않습니다. 선언할 때
String sentence = scanner.nextLine();
이것은 숫자가 있는 줄의 나머지 부분을 읽습니다(숫자 뒤에는 아무것도 없음).
나머지 줄을 무시하려면 각 nextInt() 뒤에 scanner.nextLine(); 을 배치해 보세요.
각 입력을 새 줄에 받아들이고 싶은 것 같으므로 무언가를 읽을 때마다 scanner.nextLine()
을 추가로 배치하는 대신 구분 기호를 실제로 공백 대신 개행만 일치하도록 변경하는 것이 좋습니다(기본값처럼 공백이 아닌).
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);
}
}
따라서 한 줄의 입력을 읽으려면 다음{Int, Double, ...}의 구분 기호와 동일한 동작을 하는 scanner.next()
만 있으면 됩니다.
매번 "nextLine() 접근 방식과의 차이점은 후자는 인덱스로 공백 3
, 3&공백&공백
및 3&공백&공백 무엇이든
도 허용하는 반면 전자는 한 줄의 3
만 허용한다는 것입니다.