public class ExceptionEx2 {
public static void main(String[] args) {
String[] names = { "Kim", "Lee", "Park", "Choi" };
try {
System.out.printf("0번 인덱스 요소: %s\n", names[0]);
// 4번 인덱스 요소: names 배열에는 인덱스 4가 없어서 ArrayIndexOutOfBoundsException 발생
System.out.printf("4번 인덱스 요소: %s\n", names[4]);
System.out.printf("3번 인덱스 요소: %s\n", names[3]);
} catch (ArrayIndexOutOfBoundsException ex) {
// 예외가 발생하면 catch 블록이 실행됨
System.out.println("배열 인덱스 범위를 벗어났습니다.");
} finally {
// finally 블록은 예외 발생 여부와 상관없이 항상 실행됨
System.out.println("finally 문은 예외 발생과 상관없이 항상 수행됩니다.");
}
// 프로그램 종료 문장
System.out.println("프로그램이 종료됩니다.");
}
}
설명
- String[] names = { "Kim", "Lee", "Park", "Choi" };
- names 배열을 초기화합니다. 이 배열은 "Kim", "Lee", "Park", "Choi" 4개의 요소를 가집니다.
- try 블록:
- System.out.printf("0번 인덱스 요소: %s\n", names[0]);
- names[0]는 "Kim"을 출력합니다.
- System.out.printf("4번 인덱스 요소: %s\n", names[4]);
- names 배열에는 인덱스 4가 없기 때문에 ArrayIndexOutOfBoundsException 예외가 발생합니다.
- System.out.printf("3번 인덱스 요소: %s\n", names[3]);
- 이 줄은 예외가 발생하기 전에 names[4]에서 예외가 발생하므로 실행되지 않습니다.
- System.out.printf("0번 인덱스 요소: %s\n", names[0]);
- catch (ArrayIndexOutOfBoundsException ex) 블록:
- ArrayIndexOutOfBoundsException 예외가 발생하면 이 블록이 실행됩니다.
- "배열 인덱스 범위를 벗어났습니다." 메시지를 출력합니다.
- finally 블록:
- 이 블록은 예외 발생 여부와 상관없이 항상 실행됩니다.
- "finally 문은 예외 발생과 상관없이 항상 수행됩니다." 메시지를 출력합니다.
- System.out.println("프로그램이 종료됩니다.");
- try-catch-finally 블록이 모두 실행된 후, 이 문장이 실행됩니다.
- "프로그램이 종료됩니다." 메시지를 출력합니다.
예외 발생 과정
- names[4] 접근 시 예외가 발생합니다.
- 예외가 발생하면 해당 try 블록의 실행이 중단되고 catch 블록이 실행됩니다.
- catch 블록이 실행된 후 finally 블록이 실행됩니다.
- 마지막으로 try-catch-finally 블록 외의 문장이 실행됩니다.
catch 블록
catch 블록은 try 블록 내에서 발생한 특정 예외를 처리하기 위해 사용됩니다. try 블록에서 예외가 발생하면, 해당 예외 타입에 맞는 catch 블록이 실행됩니다. 예외를 처리하고, 프로그램이 비정상적으로 종료되지 않도록 도와줍니다.
catch 블록의 역할과 동작
- 예외 발생 감지:
- try 블록에서 names[4]에 접근하려고 시도할 때, ArrayIndexOutOfBoundsException 예외가 발생합니다. 이는 names 배열에 인덱스 4가 존재하지 않기 때문입니다.
- 예외 처리:
- 예외가 발생하면, JVM은 해당 예외를 처리할 수 있는 catch 블록을 찾습니다. 여기서 catch (ArrayIndexOutOfBoundsException ex) 블록이 이 예외를 처리하도록 정의되어 있습니다.
- 예외 정보 접근:
- catch 블록 내에서 ex 변수는 발생한 예외 객체를 참조합니다. 이를 통해 예외에 대한 추가 정보를 얻거나, 특정 처리를 수행할 수 있습니다. 예를 들어, 예외 메시지를 출력하거나 로그를 남길 수 있습니다.
- 예외 처리 코드 실행:
- catch 블록 내의 코드를 실행합니다. 이 예제에서는 "배열 인덱스 범위를 벗어났습니다."라는 메시지를 출력합니다.
예외 객체의 활용
ex 변수는 예외 객체를 참조하며, 이 객체를 통해 예외에 대한 다양한 정보를 얻을 수 있습니다. 예를 들어, 예외 메시지를 출력하거나, 스택 트레이스를 출력할 수 있습니다.
catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("배열 인덱스 범위를 벗어났습니다.");
System.out.println("예외 메시지: " + ex.getMessage());
ex.printStackTrace();
}
- ex.getMessage():
- 예외 메시지를 반환합니다. 이 메시지는 예외의 원인을 설명합니다.
- ex.printStackTrace():
- 예외가 발생한 위치와 호출 스택 정보를 출력합니다. 이는 디버깅에 매우 유용합니다.
다중 catch 블록
여러 종류의 예외를 처리하기 위해 다중 catch 블록을 사용할 수 있습니다.
try {
// 코드
} catch (ArrayIndexOutOfBoundsException ex) {
// 배열 인덱스 초과 예외 처리
} catch (NullPointerException ex) {
// 널 포인터 예외 처리
} catch (Exception ex) {
// 기타 모든 예외 처리
}
각 catch 블록은 특정 예외 타입을 처리하도록 정의됩니다. 상위 타입의 예외(예: Exception)는 반드시 마지막에 위치해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
결론
catch 블록은 try 블록에서 발생한 예외를 처리하고, 프로그램이 비정상적으로 종료되지 않도록 도와줍니다. 예외 객체를 통해 추가 정보를 얻고, 적절한 예외 처리를 수행할 수 있습니다. 예외 처리는 프로그램의 안정성을 높이고, 예상치 못한 상황에서도 프로그램이 계속 실행되도록 보장하는 중요한 부분입니다.
public class MyExceptionTest {
public static void main(String[] args) {
try {
// MyException 예외를 발생시킴
throw new MyException("예외 발생시키기!!");
} catch(MyException ex) {
// 발생한 MyException 예외를 처리함
System.out.printf("예외 메세지: %s\n", ex.getMessage());
}
}
}
// 사용자 정의 예외 클래스 MyException
class MyException extends Exception {
// 기본 생성자: "내가 만든 예외 발생" 메시지를 포함
public MyException() {
super("내가 만든 예외 발생");
}
// 사용자 지정 메시지를 포함하는 생성자
public MyException(String message) {
super(message);
}
}
설명
이 예제는 사용자 정의 예외를 생성하고 이를 처리하는 방법을 보여줍니다.
MyExceptionTest 클래스
- main 메서드:
- try 블록 내에서 throw new MyException("예외 발생시키기!!");를 통해 MyException 예외를 발생시킵니다.
- catch 블록에서 발생한 예외를 잡아 ex.getMessage()를 통해 예외 메시지를 출력합니다.
MyException 클래스
- MyException 클래스:
- Exception 클래스를 상속하여 사용자 정의 예외를 만듭니다.
- 생성자:
- 기본 생성자: 메시지 "내가 만든 예외 발생"을 포함합니다.
- 사용자 지정 메시지를 포함하는 생성자: super(message)를 통해 전달된 메시지를 부모 클래스(Exception)의 생성자에 전달합니다.
예외 처리 과정
- 예외 발생:
- throw new MyException("예외 발생시키기!!"); 문장을 통해 명시적으로 예외를 발생시킵니다.
- 이때, MyException 객체가 생성되고, 메시지 "예외 발생시키기!!"가 포함됩니다.
- 예외 처리:
- 발생한 예외는 catch(MyException ex) 블록에서 처리됩니다.
- ex.getMessage()를 호출하여 예외 메시지를 출력합니다.
예외 처리의 장점
- 명확한 예외 정의:
- 사용자 정의 예외를 통해 특정 상황에 대한 예외를 명확하게 정의할 수 있습니다.
- 가독성 향상:
- 코드의 가독성을 높이고, 예외 상황을 더 쉽게 이해할 수 있습니다.
- 유연한 예외 처리:
- 다양한 예외 상황에 대해 세부적으로 처리할 수 있습니다.
'공부 기록 > JAVA' 카테고리의 다른 글
20240423 - Java 조건문 (0) | 2024.04.23 |
---|---|
2024.04.18. Java 2 (0) | 2024.04.18 |