package com.test.run;
import java.util.Scanner;
public class Run {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("숫자 입력 : ");
int iNum = scan.nextInt();
System.out.print("문자열 입력 : ");
String str = scan.nextLine();
System.out.println(iNum + " " + str);
}
}
위의 코드에서 원하는 답안은 숫자 하나를 입력받고 문자열을 입력받아 연결시켜 출력하는 구문입니다.
하지만 위의 코드를 실행하면 뜻밖의 에러가 발생합니다.
숫자 입력 : 5
문자열 입력 : 5
숫자만 입력했을 뿐인데 문자열은 입력도 못해보고 숫자가 출력되며 프로그램이 종료하게 됩니다.
이러한 문제점은 Scanner 클래스의 nextLine()메소드와 다른 메소드들이 읽어오는 범위가 다르기 때문입니다.
nextInt(), nextDouble() 등 과 같은 메소드는 \n문자(개행문자) 전까지를 읽어오고 \n문자 자체는 읽어오지 않으므로 버퍼의 출발점이 \n문자 전에 있습니다. nextLine() 메소드는 \n문자까지만 읽어오므로 nextInt(), nextDouble() 등 과 같은 메소드 이후에 사용하면 버퍼의 출발점이 바로 \n문자 전이기 때문에 에러가 발생하게 됩니다. 따라서 nextLine() 메소드를 사용하기 전에 nextInt()같은 메소드를 사용하였다면 nextLine() 메소드를 사용함으로써 버퍼의 출발점 위치를 변경해주어야 합니다.
package com.test.run;
import java.util.Scanner;
public class Run {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("숫자 입력 : ");
int iNum = scan.nextInt();
scan.nextLine();
System.out.print("문자열 입력 : ");
String str = scan.nextLine();
System.out.println(iNum + " " + str);
}
}
숫자 입력 : 5
문자열 입력 : five
5 five
위와 같이 코드를 수정하면 의도했던데로 출력이 나오게 됩니다.
next()메소드도 정수, 실수형 메소드들과 마찬가지로 개행문자 자체는 읽어오지 않습니다.