1. 에러(Error)와 예외(Exception)
에러 정의
- 메모리 부족과 같이 복구할 수 없는 상황
- 프로그램의 비정상적인 종료를 막을 수 없음
예외 정의
- 읽으려는 파일이 없는 것과 같이 수습할 수 있는 상황
예외 처리(Exception Handling)
- 예외 발생 시 프로그램의 비정상적인 종료를 막고 정상적인 상태를 유지하는 것
예외 클래스 계층 구조
Checked Exception : 예외에 대한 대처 코드가 없으면 컴파일 시 에러 발생
Unchecked Exception(RuntimeException) : 예외에 대한 대처 코드가 없더라도 컴파일 시 에러가 발생하지 않지만, 실행 시 프로그램이 비 정상적으로 종료됨.
try ~ catch 구문
- try 부분에 예외가 발생할 수 있는 코드를 작성
- try 부분에 예외가 발생하면 JVM이 해당 예외 클래스의 객체를 생성(throw new XXException) 후 throw
- catch를 이용하여 throw된 에러를 받고 처리할 코드를 작성
다중 catch 구문 작성시 주의사항
- JVM이 던진 에외는 catch 문장에서 다형성이 적용됨
- 위에서부터 아래로 catch 구문이 수행됨
- 자식 범위에서 부모 순으로 정의해야 함
예외 처리 예시
// Unchecked Exception(RuntimeException)
public class SimpleException {
public static void main(String[] args) {
int[] intArray = {1};
System.out.println(intArray[2]); // ArrayIndexOutOfBoundsException 발생
System.out.println("프로그램 종료합니다.");
}
}
// try ~ catch로 예외 처리
public class SimpleException {
public static void main(String[] args) {
int[] intArray = {1};
try{
System.out.println(intArray[2]);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열의 크기가 맞지 않음");
}
System.out.println("프로그램 종료합니다.");
}
}
finally
- 예외 발생 여부와 상관없이 언제나 실행
- 중간에 return을 만나더라도 finally를 실행한 후 리턴
// 2 -> 3 -> 1 순으로 실행
try {
int i = 1 / 0;
return; // (1)
} catch (Exception e) {
// (2)
} finally {
// (3)
}
// 3 -> 1 순으로 실행
try {
int i = 1 / 2;
return; // (1)
} catch (Exception e) {
// (2)
} finally {
// (3)
}
try with resources
- JDK 7 이상부터 리소스의 자동 close를 처리해주는 방법
- try 선언문에 선언된 객체를 자동으로 close 호출
- 단 AutoCloseable interface가 구현된 객체만 가능
// try~catch 구문을 통한 리소스 관리
try (FileInputStream fileInput=new FileInputStream("1.txt")){
fileInput.read();
} catch (IOException e) {
// 에러처리
}
2. 예외처리 위임(throws 키워드)
예외처리 위임
- 해당 메서드에서 처리할 예외를 부모 메서드로 위임
- 메인 메서드도 예외처리를 위임할 시 JVM이 받고 프로그램이 비정상적으로 종료됨.
- Unchecked Exception(RuntimeException)은 'throws' 하지 않아도 자동으로 부모 메서드로 위임됨
void exceptionMethod() throws Exception1, Exception2..{
// 예외 발생
}
로그 분석 및 예외 추적
- 예외를 처리하기 위해 예외 종류, 예외 원인, 어디서 발생했는지(디버깅 출발점)를 알아야 함
'Language > Java' 카테고리의 다른 글
[Java] int 타입을 이진수로 바꾸는 방법 (0) | 2022.02.06 |
---|---|
[Java] Collection Framework - List, Set, Map (0) | 2022.01.27 |
[Java] 제네릭(Generics) (0) | 2022.01.25 |
[Java] 추상 클래스와 인터페이스 (0) | 2022.01.25 |
[Java] 다형성(Polymorphism) (0) | 2022.01.25 |