[이슈해결] Java - java.lang.ArrayIndexOutOfBoundsException

[이슈해결] Java - java.lang.ArrayIndexOutOfBoundsException

Error Message: java.lang.ArrayIndexOutOfBoundsException


🌰 오류메시지


1
2
3
4
// Error Message

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Main.main(Main.java:12)

💎 문제상황


지원 회사의 온라인 코딩테스트에 응시하다가 에러가 발생했습니다. 해당 에러는 최근에 제가 자주 접했던 에러입니다. 아래 코드의 의도는 개행문자 단위로 한 번에 입력을 받아 처리하고, 문자열과 숫자를 따로 분리하려고 했습니다. String[] input = br.readLine().split("\\n");에서 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException에러가 발생했고, 이를 처리하기 위해 알아보았습니다.


🧩 예시코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Wrong Code : Error가 발생한 Full Code입니다.

import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] input = br.readLine().split("\\n"); // Error
int x = 0;

for (int i=0; i<n; i++) {
String command = input[i].split(" ")[0];
x = Integer.parseInt(input[i].split(" ")[1]);
}
}
}

예시 입력값]

12
enqueue 1
enqueue 2
enqueue 2
enqueue 1
enqueue 2
dequeue
dequeue
dequeue
dequeue
dequeue
enqueue 7
dequeue


🔑 해결방안


예시 입력값을 보시면 dequeue와 enqueue가 번갈아 나옵니다. String[] input에서 한 번에 입력받지 않고, for문을 사용하여 한 줄씩 입력받는 방식으로 변경하여 에러를 해결했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Right Code : Error를 해결한 Full Code입니다.

import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
// String[] input = br.readLine().split("\\n"); // Error
int x = 0;

for (int i=0; i<n; i++) {
String input = br.readLine(); // Solving
String command = input[i].split(" ")[0];
x = Integer.parseInt(input[i].split(" ")[1]);
}
}
}

위의 코드에서 Error가 발생했던 입력문을 Solving 부분으로 바꿔주어 에러를 해결할 수 있었습니다. 해당 이슈에서는 ArrayIndexOutOfBoundsException 에러가 난 이유가 br.readLine()에 이미 강제개행이 포함이 되어 있어, 없는 문자에 접근하는 것으로 이해했습니다. 개행문자 단위로 입력을 받을 경우, 위의 내용처럼 입력을 받는 것이 낫다는 것을 알게 되었습니다.


Comments