Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 ArrayStoreException(비검사 예외)이란? 발생 원인과 try-catch 처리 방법

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 처리 방법

ArrayStoreExceptiontry와 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>)을 사용하는 것이 더 안전한 대안입니다.