반응형
Java를 사용하면서 IndexOutOfBoundsException, ConcurrentModificationException, NullPointerException과 같은 예외는 개발자들에게 흔히 발생하는 문제입니다. 이 예외들은 코드의 안정성을 저해하며, 잘못된 사용자 경험을 초래할 수 있습니다.
1. IndexOutOfBoundsException 예외 처리
IndexOutOfBoundsException은 리스트나 배열의 유효하지 않은 인덱스에 접근하려고 할 때 발생합니다.
원인
- 유효 범위를 초과한 인덱스에 접근
- 빈 리스트에서 요소를 삭제하거나 읽으려고 시도
- 반복문에서 잘못된 조건 설정
해결 방법
- 데이터 구조의 크기를 확인하고 인덱스 유효성을 검사
- 안전한 조건문을 활용하여 예외를 방지
예제 코드
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은 리스트나 맵을 반복하면서 동시에 수정하려고 할 때 발생합니다.
원인
- 반복 중인 리스트에서 직접 요소를 추가하거나 삭제
- 멀티스레드 환경에서 동기화 없이 데이터 구조에 접근
해결 방법
- 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 방지
NullPointerException은 null 참조를 가진 객체에 접근하려고 시도할 때 발생합니다.
원인
- 초기화되지 않은 변수 사용
- null을 반환받은 값을 바로 사용
- 외부 입력 데이터의 예상치 못한 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 Collections 공식 문서: https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html
- Java Optional API: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
반응형
'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 |