Exception과 Error의 차이

dy7888·2023년 8월 26일
0

✅ 오류(Error)

시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제를 의미한다. 개발자가 미리 예측하여 방지할 수 없다.

  • StackOverflowError
    호출의 깊이가 깊어지거나 재귀가 지속되어 stack overflow 발생 시 던져지는 오류

  • OutOfMemoryError
    JVM이 할당된 메모리의 부족으로 더 이상 객체를 할당할 수 없을 때 던져지는 오류. 힙 사이즈가 부족하거나, 너무 많은 class를 로드할 때, 가용 가능한 swap이 없을 때, 큰 메모리의 native 메소드가 호출될 때 등



✅ 예외(Exception)

프로그램 실행 중에 예측 가능한 상황에서 발생할 수 있는 문제를 말한다. 개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생한다. 오류와 달리 개발자가 미리 예측하여 방지할 수 있다.

오류의 상황을 미리 방지하기 위해서 Exception을 만들 수 있으며, try-catch문으로 예외처리(Exception Handling)을 할 수 있다.

Exception의 종류

1. Checked Exception
예외 처리가 필수이며, 처리하지 않으면 컴파일 되지 않음. 예외 발생 시 롤백하지 않음. JVM 외부와 통신(네트워크, 파일 시스템 등)할 때 주로 사용

  • RuntimeException 이외 모든 예외
  • IOException, SQLException 등

2. Unchecked Exception
Runtime(실행 시)에 발생하는 Exception, 예외 처리가 필수는 아님. 예외 발생 시 롤백해야 함. 대부분 Unchecked Exception을 사용.

  • RuntimeException 하위의 모든 예외
  • NullPointerException, IndexOutOfBoundException 등

대표적인 Exception 클래스

  • NullPointerException
    null인 변수나 객체에 접근하려고 할 때 발생.
    객체가 필요한데 응용 프로그램이 null을 사용하려고 시도할 경우 던져지는/던질 수 있는 예외

  • IllegalArgumentException
    메소드가 허가되지 않거나 부적절한 argument를 받았을 경우에 던져지는/던질 수 있는 예외

  • ArthmeticException
    정수를 0으로 나누려고 할 때

  • ClassCastException
    타입 변환은 상위 클래스와 하위클래스간에 발생하고 구현 클래스와 인터페이스간에 발생하는데, 이런 관계가 아니면 클래스는 다른 클래스로 타입을 변환할 수 없다. 하지만 이 규칙을 무시하고 억지로 타입을 변환시킬경우 발생하는 에러.

  • IndexOutOfBoundsException

  • IndexOutOfBoundsException

  • IOException

  • IllegalStateException

  • ConcurrentModificationException

  • UnsupportedOperationException




Exception Handling 2가지 방법

try-catch문

  • try에는 위험한 로직이 들어가고, catch에는 예외 발생 시 수행할 로직이 들어간다.

  • catch 구문은 else if처럼 여러개 사용 가능.

  • finally는 마지막에 실행하고 싶은 로직이 들어가며, 대표적으로 .close()가 있다.

  • 데이터베이스를 거쳐올 때 변수가 많이 생기기 때문에, 주로 데이터베이스에 데이터를 주고 받을 때 많이 사용한다.
    finally에서 보통 데이터베이스와의 연결을 끊어주는 코드를 삽입한다.


try {
	// 위험한 코드
}catch(예외클래스 변수명) {
	// 예외 발생시 처리하는 코드
}

사용 예시

class ExceptionEx {

	public int divide(int i, int k) {
		try {
			value = i/k;
		}catch(ArithmeticException ex){
		System.out.println("0으로 나눌 수 없음.");
		}
	}
} 

예외 던지기 (throws 구문)

예외가 발생한 메소드에서 직접 처리하지 않고 예외 발생 메소드를 호출한 쪽에다 예외 책임을 떠넘긴다.

->divide() 메소드에서 발생한 Exception을 거기서 처리하지 않고, divide를 호출한 쪽에다 떠넘김

리턴타입 메소드명(매개변수, ... ) throws Exception클래스명 {

}

사용 예시

public class ExceptionCall {
	public static void main(String[] args) {
		ExceptionEx exobj = new ExceptionEx();
		try {
			int value = exobj.divide(10, 0);
			System.out.println(value);
		}catch(ArithmeticException ex) {
			System.out.println("0으로 나눌 수 없습니다.");
		}
	}
}
class ExceptionEx {
	public int divide(int i, int k) throws ArithmeticException{
		int value = 0;
		value = i / k;
		return value;
	}
}
profile
나의 기록하는 개발 일지

0개의 댓글