728x90
반응형
Java 자주발생하는 오류 정리 #1
Frequent Java Cleanup Errors #1
반응형
NullPointerException
NullPointerException은 객체 참조가 null인 상태에서 메서드 호출, 필드 접근 등의 작업을 시도할 때 발생합니다. 즉, null인 객체에 접근하려고 할 때 발생하는 예외입니다.
주로 객체를 초기화하지 않았거나, 객체 참조를 null로 설정한 상태에서 해당 객체의 메서드를 호출하거나 필드에 접근하려고 할 때 발생합니다.
취약점
- NullPointerException은 프로그램의 불안정성을 야기할 수 있습니다. 악의적인 사용자가 객체를 null로 설정하거나, 미처 초기화하지 않은 상태에서 객체를 사용하도록 유도하여 의도치 않은 동작이 발생할 수 있습니다.
오류상황
// 오류예시: 객체가 null일 경우에도 사용하도록 처리하지 않음
String username = null;
System.out.println("Welcome, " + username + "!"); // NullPointerException 발생
솔루션
// 솔루션 1: 객체가 null인지 체크하여 처리
String username = null;
if (username != null) {
System.out.println("Welcome, " + username + "!");
} else {
System.out.println("Guest"); // 기본값으로 대체하거나 예외 처리
}
// 솔루션 2: try-catch로 예외 처리
String username = null;
try {
System.out.println("Welcome, " + username + "!"); // NullPointerException 발생
} catch (NullPointerException e) {
System.out.println("Guest"); // 기본값으로 대체하거나 예외 처리
}
솔루션 설명
- 객체 참조를 사용하기 전에 해당 객체가 null인지 확인하여 null일 경우에는 안전한 방어적인 코드를 작성합니다. null 체크를 통해 NullPointerException을 방지하고, 기본값으로 대체하거나 예외 처리하여 프로그램의 불안정성을 막습니다.
- try-catch 블록을 사용하여 NullPointerException이 발생하면 catch 블록에서 해당 예외를 처리합니다. 예외가 발생하면 기본값으로 대체하거나 예외 처리를 수행하여 프로그램의 안정성을 확보합니다.
728x90
ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException은 배열의 인덱스 범위를 초과하여 접근하려고 할 때 발생합니다. 즉, 유효하지 않은 인덱스를 사용할 때 발생하는 예외입니다.
주로 배열의 크기를 넘어서는 인덱스를 사용하려고 할 때 발생합니다. 예를 들어, 배열의 길이가 5인데 인덱스 5를 사용하는 경우 등이 있습니다.
취약점
- 잘못된 인덱스를 사용하면 프로그램이 비정상적으로 종료될 수 있습니다. 악의적인 사용자가 배열 인덱스를 조작하여 데이터를 읽거나 쓰는 등의 보안 취약점을 유발할 수 있습니다.
오류상황
// 오류예시: 유효하지 않은 인덱스 접근
int[] numbers = {1, 2, 3};
int value = numbers[5]; // ArrayIndexOutOfBoundsException 발생
솔루션
// 솔루션 1: 인덱스를 항상 유효한 범위 내에서 사용
int[] numbers = {1, 2, 3};
int value = 0;
int index = 5;
if (index >= 0 && index < numbers.length) {
value = numbers[index];
} else {
// 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값 설정
}
// 솔루션 2: try-catch로 예외 처리
int[] numbers = {1, 2, 3};
int value = 0;
int index = 5;
try {
value = numbers[index]; // ArrayIndexOutOfBoundsException 발생
} catch (ArrayIndexOutOfBoundsException e) {
// 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값 설정
}
솔루션 설명
- 인덱스를 사용하기 전에 해당 인덱스가 배열의 범위 내에 있는지 확인하여 범위를 초과하지 않도록 합니다. 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값을 설정하여 프로그램의 안정성을 확보합니다.
- try-catch 블록을 사용하여 ArrayIndexOutOfBoundsException이 발생하면 catch 블록에서 해당 예외를 처리합니다. 예외가 발생하면 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값을 설정하여 프로그램의 안정성을 확보합니다.
IndexOutOfBoundsException
IndexOutOfBoundsException은 컬렉션(List, Map 등)의 인덱스나 크기 범위를 초과하여 접근하려고 할 때 발생합니다. ArrayIndexOutOfBoundsException과 비슷하지만 배열이 아닌 컬렉션에서 발생합니다.
어떤 경우에 잘 발생하는지: 컬렉션의 크기를 넘어서는 인덱스를 사용하려고 할 때 발생합니다. 예를 들어, 리스트의 크기가 3인데 인덱스 5를 사용하는 경우 등이 있습니다.
취약점
- 잘잘못된 인덱스를 사용하면 프로그램이 비정상적으로 종료될 수 있습니다. 악의적인 사용자가 컬렉션 인덱스를 조작하여 데이터를 읽거나 쓰는 등의 보안 취약점을 유발할 수 있습니다.
오류상황
// 오류예시: 유효하지 않은 인덱스 접근
List<String> list = new ArrayList<>();
list.add("apple");
String fruit = list.get(5); // IndexOutOfBoundsException 발생
솔루션
// 솔루션 1: 인덱스를 항상 유효한 범위 내에서 사용
List<String> list = new ArrayList<>();
list.add("apple");
String fruit = null;
int index = 5;
if (index >= 0 && index < list.size()) {
fruit = list.get(index);
} else {
// 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값 설정
}
// 솔루션 2: try-catch로 예외 처리
List<String> list = new ArrayList<>();
list.add("apple");
String fruit = null;
int index = 5;
try {
fruit = list.get(index); // IndexOutOfBoundsException 발생
} catch (IndexOutOfBoundsException e) {
// 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값 설정
}
솔루션 설명
- 컬렉션에서도 배열과 마찬가지로 인덱스 값을 사용하기 전에 해당 인덱스가 컬렉션의 범위 내에 있는지 확인하여 범위를 초과하지 않도록 합니다. 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값을 설정하여 프로그램의 안정성을 확보합니다.
- try-catch 블록을 사용하여 IndexOutOfBoundsException이 발생하면 catch 블록에서 해당 예외를 처리합니다. 예외가 발생하면 예외 처리 또는 유효한 인덱스 값을 사용하도록 기본값을 설정하여 프로그램의 안정성을 확보합니다.
728x90
반응형