JAVA

[JAVA] List 자주 발생하는 문제와 해결법

인생아 2024. 11. 20. 22:02
반응형

Java를 사용하면서 IndexOutOfBoundsException, ConcurrentModificationException, NullPointerException과 같은 예외는 개발자들에게 흔히 발생하는 문제입니다. 이 예외들은 코드의 안정성을 저해하며, 잘못된 사용자 경험을 초래할 수 있습니다.

1. IndexOutOfBoundsException 예외 처리

IndexOutOfBoundsException리스트나 배열의 유효하지 않은 인덱스에 접근하려고 할 때 발생합니다.

원인

  1. 유효 범위를 초과한 인덱스에 접근
  2. 빈 리스트에서 요소를 삭제하거나 읽으려고 시도
  3. 반복문에서 잘못된 조건 설정

해결 방법

  • 데이터 구조의 크기를 확인하고 인덱스 유효성을 검사
  • 안전한 조건문을 활용하여 예외를 방지

예제 코드

import java.util.ArrayList;
import java.util.List;

public class IndexOutOfBoundsExample {
    public static void main(String[] args) {
        List<String> cities = new ArrayList<>();
        cities.add("서울");
        cities.add("부산");
        cities.add("대구");

        try {
            // 잘못된 인덱스 접근
            System.out.println(cities.get(5));
        } catch (IndexOutOfBoundsException e) {
            System.out.println("잘못된 인덱스입니다. 유효 범위: 0부터 " + (cities.size() - 1) + "까지");
        }

        // 유효성 검사로 방지
        int index = 2;
        if (index >= 0 && index < cities.size()) {
            System.out.println("유효한 값: " + cities.get(index));
        } else {
            System.out.println("인덱스가 유효하지 않습니다.");
        }
    }
}

위 코드는 예외를 발생시키지 않도록 안전하게 데이터의 인덱스를 확인합니다.

반응형

2. ConcurrentModificationException 원인과 대처법

ConcurrentModificationException리스트나 맵을 반복하면서 동시에 수정하려고 할 때 발생합니다.

원인

  1. 반복 중인 리스트에서 직접 요소를 추가하거나 삭제
  2. 멀티스레드 환경에서 동기화 없이 데이터 구조에 접근

해결 방법

  • Iterator의 remove() 메서드를 사용하여 안전하게 삭제
  • CopyOnWriteArrayList와 같은 동기화된 컬렉션을 사용

예제 코드

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcurrentModificationExample {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("홍길동");
        names.add("이순신");
        names.add("유관순");

        // 예외 발생 예시
        try {
            for (String name : names) {
                if (name.equals("이순신")) {
                    names.remove(name);
                }
            }
        } catch (ConcurrentModificationException e) {
            System.out.println("ConcurrentModificationException 발생!");
        }

        // 안전한 삭제 방법
        Iterator<String> iterator = names.iterator();
        while (iterator.hasNext()) {
            String name = iterator.next();
            if (name.equals("이순신")) {
                iterator.remove();
            }
        }
        System.out.println("수정된 리스트: " + names);
    }
}

위 코드는 Iterator를 사용하여 안전하게 요소를 삭제하는 방법을 보여줍니다.

3. NullPointerException 방지

NullPointerExceptionnull 참조를 가진 객체에 접근하려고 시도할 때 발생합니다.

원인

  1. 초기화되지 않은 변수 사용
  2. null을 반환받은 값을 바로 사용
  3. 외부 입력 데이터의 예상치 못한 null 값

해결 방법

  • null 체크를 철저히 수행
  • Optional API 사용 (Java 8 이상)
  • 외부 데이터 처리 시 기본값 지정

예제 코드

import java.util.Optional;

public class NullPointerExample {
    public static void main(String[] args) {
        String name = null;

        // 기본 null 체크
        if (name != null) {
            System.out.println(name.length());
        } else {
            System.out.println("name 변수가 null입니다.");
        }

        // Optional 활용
        Optional<String> optionalName = Optional.ofNullable(name);
        System.out.println(optionalName.orElse("기본값"));

        // null 방지를 위한 기본값 설정
        String city = getCityName(null);
        System.out.println("도시 이름: " + city);
    }

    private static String getCityName(String input) {
        return input != null ? input : "알 수 없음";
    }
}

위 코드는 Optional과 null 체크를 사용하여 예외 발생을 방지하는 방법을 보여줍니다.

참고 사이트

반응형

'JAVA' 카테고리의 다른 글

[JAVA] Gson 환경 설정  (0) 2024.11.24
[JAVA] Gson 이란?  (1) 2024.11.23
[JAVA] List와 Java 8 이상 기능 통합  (0) 2024.11.22
[JAVA] List 자주 사용하는 유틸리티 메서드와 트릭  (0) 2024.11.21
[JAVA] List성능 비교와 최적화  (0) 2024.11.19
[JAVA] List 활용  (2) 2024.11.18
[JAVA] Immutable List (불변 리스트)  (0) 2024.11.18
[JAVA] List와 동기화  (0) 2024.11.18