java.lang.ArrayStoreException은 비검사(unchecked) 예외로, 특정 타입의 배열에 서로 다른 타입의 객체를 저장하려고 시도할 때 발생합니다. 실무에서는 java.lang.ArrayStoreException: java.lang.Integer 형태의 오류 메시지를 가장 흔하게 접하게 되는데, 이는 String 배열이나 float 배열처럼 다른 타입으로 선언된 배열에 Integer 값을 넣으려고 할 때 나타나는 대표적인 사례입니다.
예제 1: 예외 발생 상황
public class ArrayStoreExceptionTest {
public static void main(String[] args) {
Object[] names = new Float[2];
names[1] = new Integer(2);
}
}
실행 결과
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
at ArrayStoreExceptionTest.main(ArrayStoreExceptionTest.java:4)
위 프로그램에서 java.lang.ArrayStoreException: java.lang.Integer가 발생한 이유를 살펴보면 다음과 같습니다.
- java.lang.ArrayStoreException: java.lang.Float 타입으로 생성된 배열에 java.lang.Integer 객체를 저장하려고 시도했을 때 Java 언어가 던지는 예외입니다.
- java.lang.Integer: 다른 타입의 배열에 저장하려고 시도한 객체의 실제 타입을 의미합니다.
ArrayStoreException 처리 방법
ArrayStoreException은 try와 catch 블록을 사용해 손쉽게 처리할 수 있습니다.
- ArrayStoreException이 발생할 가능성이 있는 코드를 try와 catch 블록으로 감쌉니다.
- catch 블록에서 ArrayStoreException을 잡아냅니다(catch).
- 예외를 직접 처리하기 때문에 프로그램 실행이 중단되지 않으며, 필요한 후속 조치를 정의할 수 있습니다.
예제 2: try-catch로 예외 처리하기
public class ArrayStoreExceptionTest {
public static void main(String[] args) {
Object[] names = new Float[2];
try {
names[1] = new Integer(2);
} catch (ArrayStoreException e) {
e.printStackTrace();
System.out.println("ArrayStoreException is handled");
}
System.out.println("Continuing with the statements after try and catch blocks");
}
}
실행 결과
ArrayStoreException is handled
Continuing with the statements after try and catch blocks
java.lang.ArrayStoreException: java.lang.Integer
at ArrayStoreExceptionTest.main(ArrayStoreExceptionTest.java:5)
위 예제에서 예외가 발생하면 실행 흐름은 예외가 발생한 지점에서 곧바로 catch 블록으로 이동합니다. catch 블록 안의 문장들이 실행된 후에는 try-catch 블록 뒤에 있는 문장들이 계속해서 정상적으로 수행됩니다. 즉, 예외를 적절히 처리하면 프로그램이 비정상 종료되지 않고 안정적인 실행 흐름을 유지할 수 있습니다.
추가 팁: 예외를 미리 예방하기
try-catch로 처리하는 것만큼 중요한 것은 애초에 예외가 발생하지 않도록 코드를 작성하는 것입니다.
- 배열을 생성할 때 실제로 저장할 객체의 타입과 일치하는 타입으로 선언합니다.
Object[]타입으로 배열을 다룰 때는 값을 저장하기 전에instanceof연산자로 타입을 검증합니다.- 컴파일 타임에 타입 안정성을 확보하고 싶다면 제네릭 컬렉션(예:
List<Float>)을 사용하는 것이 더 안전한 대안입니다.