[JAVA] Exception

유존돌돌이·2022년 2월 21일
0

공부

목록 보기
2/22
post-thumbnail

자바의 예외종류

  • Error
  • Checked Exception
  • Unchecked Exception

1. Error란?

시스템에 비정상적인 상황이 생겼을 때 발생한다. 개발자가 미리 처리할 수 없기 때문에 애플리케이션에서 오류에 대한 처리를 신경쓰지 않아도 된다. (ex OutOfMemoryError, StackOverflowError)

2. Exception이란?

입력 값에 대한 처리가 불가능하거나, 프로그램 실행중에 참조값이 잘못된 경우 등 정상적인 프로그램 흐름이 불가능한 경우를 말한다. 자바에서는 이런 Exception상황을 예측하여 핸들링 할 수 있다. Exception에는 크게 Checked Exception, Unchecked Exception이 있다.

2.1 Checked Exception

RuntimeException 하위 클래스가 아니며, Compile 시점에 확인이 된다.
반드시 예외처리(try/catch or throw)를 해야한다.

2.2 Unchecked Exception

RuntimeException 하위 클래스이며, Runtime중에 확인이 된다.
Checked Exception과는 다르게 반드시 예외 처리하지 않는다. (대부분 대처 가능하며 개발자의 부주의에 의한 Exception 이므로 예외 처리 안해도 사용 가능)

Exception의 종류

1. Checked Exception

1) ClassNotFoundException : 문자열로 클래스 로딩을 시도하다가 클래스가 없는 경우
2) InterruptedException : 작업이 더이상 필요없는 스레드 Interrupt(종료) 시켜야하는데, 어디에선가 블로킹 되어 있다면 발생 (Thread.sleep 테스트할때 종종 발생하지)
3) IOException : 파일 입출력시 파일이 없거나 네트워크 I/O시에 발생
4) InstantiationException : 추상 클래스나 인터페이스를 인스턴스화하고자 했을때 발생
5) FileNotFoundException : 파일이 발견되지 않았을때 발생

2. Unchecked Exception

1) ArithmeticException : 0 나누기 등의 산술 시, 예외 발생
2) NullPointerException : null 오브젝트로 접근했을 때 발생
3) ArrayIndexOutOfBoundesException : 범위 밖의 배열 참조 시 발생
4) ArrayStoreException : 선언된 유형의 배열에 다른 유형의 객체 저장하려할때 발생
5) IllegalThreadStateException : 쓰레드가 요구한 처리를 하기위해 적합한 상태가 아닐때 발생

Exception 처리방법

1. 예외 복구

1) 예외를 잡아서 일정 시간, 조건만큼 대기하고 다시 재시도를 반복한다.
2) 최대 재시도 횟수를 넘기게 되는 경우 예외를 발생시킨다.
3) 몇번의 예외가 있을 가능성이 있는경우 예외 복구방식 사용

private void mayThrowExceptionLogic() {
    int maxTry = 20;
    while(maxTry --> 0) {
    	try {
    		// ???Exception 이 Throw 될 수 가능성이 있는 로직
        
        	// 성공 시 return, 해당 메소드 종료
        	return ;
    	} catch(???Exception e) {
    		// Error 로그 출력
                // 실패 로직 존재 시 원상 복구
        	// 일정 시간 동안 대기
    	} finally {
    		// 작업에 사용한 Resource 반환 및 정리
    	}
    }
    // 최대 횟수 실패시 예외 Throw
    throw new MaxTryFailedException();
}

2. 예외 회피

1) 가장 많이 하는 처리 방법
2) 호출 부분에서 처리안하고 회피하는 것은 명확하게 throw 할 경우에만 쓰는것이 좋음

private void mayThrowExceptionLogic() throws ???Exception {
	// 비즈니스 로직
}

3. 예외 전환

1) 회피와 같이 예외를 던져버린다.
2) 하지만 예외 처리를 세분화하여 적절한 예외로 전환하여 넘김
3) 명확한 예외처리 가능

public void add(User user) throws DuplicateUserIdException, SQLException {
    try {
        // ...생략
    } catch(SQLException e) {
        if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) {
            throw DuplicateUserIdException();
        }
        else throw e;
    }
}

source :
https://devlog-wjdrbs96.tistory.com/351
https://www.nextree.co.kr/p3239/
https://madplay.github.io/post/java-checked-unchecked-exceptions

0개의 댓글