[원인]
Scanner 클래스 중 next()와 nextLine() 메서드를 함께 사용할 경우 오류가 생길 수 있다.
왜냐하면 next() 메소드는 개행문자(\n, \t)를 기준으로 입력을 구분하는데, nextLine() 메서드는 개행문자를 모두 포함하여 입력을 받기 때문이다.
그게 왜 문제냐 하면, 만약에 코드를 아래와 같이 만들었다면
첫 번째 int number를 입력하고 엔터를 치던가 스페이스를 누르던 가 했을 때, 가상의 저장공간에 해당 개행이 남아있다가 뒤의 nextLine() 에 흡수되어 결과로 나오게 되기 때문이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt(); // 정수 입력
String text = sc.nextLine(); // 문자열 입력 (개행 문자 때문에 빈 문자열이 입력됨)
System.out.println(text.charAt(0)); // 빈 문자열에서 첫 번째 문자 접근 시 오류 발생
}
}
[해결법]
1. sc.nextLine(); 을 통해 개행 문자를 흡수 하도록 넣어 줘야 한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt(); // 정수 입력
sc.nextLine(); // 개행 문자 제거
String text = sc.nextLine(); // 실제 문자열 입력
System.out.println(text.charAt(0)); // 첫 번째 문자 출력
sc.close();
}
}
2. Scanner 를 두 개 만들어 준다
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);
int number = sc1.nextInt(); // 정수 입력
String text = sc2.nextLine(); // 문자열 입력 (개행 문자 때문에 빈 문자열이 입력됨)
System.out.println(text.charAt(0)); // 빈 문자열에서 첫 번째 문자 접근 시 오류 발생
}
}
'JAVA' 카테고리의 다른 글
[Java] 문자열을 반복하는 메서드 - repeat() (0) | 2024.10.24 |
---|---|
CompletableFuture 에서 명시적인 값을 지정하기 (0) | 2024.07.17 |
자바의 <T> 제네릭 타입 (Generic Type) (0) | 2024.05.24 |
MVC 모델 (0) | 2023.10.27 |
StringBuilder 사용법과 메서드 정리 (0) | 2023.09.09 |