Java

[Java] nextInt() 사용 후 nextLine() 사용 시 주의할 점

hyomee2 2024. 9. 1. 22:59

아래와 같이 코드를 작성했고,

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int count = 0;

HashMap<String, int[]> studying = new HashMap<>();
HashMap<String, int[]> studyTime = new HashMap<>();

for(int i = 0; i < n; i++) {
    String s = sc.nextLine();
    String[] str = s.split("[ :]");
    String name = str[0];
    // ... (코드 생략)
}

아래의 입력값들을 입력하려 했다.

 

그런데 8 12를 입력하고, jack를 입력하기도 전에

for문의 s에 값이 공백으로 들어가고

ArrayIndexOutOfBoundsException이 발생하는 것을 확인할 수 있었다.(코드 생략된 부분에서)

 

 

Scanner.nextInt()은 사용자 입력의 가장 마지막 개행문자(enter)를 제거하지 않고 개행문자 전까지만 숫자로 입력받는다.

그 뒤에 Scanner.nextLine()이 호출되게 되면,

nextInt()에서 처리되지 않은 개행문자가 nextLine()의 입력으로 처리되어 문제가 발생한다.

 

따라서 nextInt() 뒤에 nextLine()을 사용하려면 개행문자를 제거하기 위해 nextLine()을 한번 더 코드에 추가해주면 된다.

의도했던 nextLine()의 앞에 추가해주면 된다.

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int count = 0;

HashMap<String, int[]> studying = new HashMap<>();
HashMap<String, int[]> studyTime = new HashMap<>();

sc.nextLine();

for(int i = 0; i < n; i++) {
    String s = sc.nextLine();
    String[] str = s.split("[ :]");
    String name = str[0];
    // ... (코드 생략)
}

 

혹은 nextInt() 대신 nextLine()을 이용해 입력받고 Integer.parseInt()를 이용해 int로 바꿔주는 방법을 이용할 수도 있다.

'Java' 카테고리의 다른 글

[Java] 13. Collection (3) Stack & Queue  (0) 2024.08.23
[Java] 13. Collection (2) List - LinkedList  (0) 2024.08.22
[Java] 13. Collection (1) List - ArrayList  (0) 2024.08.22
[Java] 13. Collection  (0) 2024.08.22
[Java] 12. 제네릭 프로그래밍  (0) 2024.08.21