[Java] 에러와 예외
Language/Java

[Java] 에러와 예외

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..{
    // 예외 발생
}

 

로그 분석 및 예외 추적

- 예외를 처리하기 위해 예외 종류, 예외 원인, 어디서 발생했는지(디버깅 출발점)를 알아야 함

로그 구조