Programming/Java

[Java] 예외 처리 (Exception Handling)

Isaac S. Lee 2023. 8. 3. 17:16

예외는 런타임 오류가 발생한 것을 의미하며, 이러한 예외가 발생할 것을 예측하여 예외처리를 하는 게 가능하다.

Java에서는 예외 처리 하는 방식으로 전통적인 방식과 전용 방식이 있다.

전통적인 방식은 if else 문을 사용하며, 전용 방식으로는 try catch finally 문을 사용한다.

 

💡try catch finally


try {
	
} catch (Exception e) {
	// TODO: handle exception
}
private static void tryCatch() {
	int num = 10;
	
	try { 
		// 비즈니스 영역
		System.out.println(100 / num);
	} catch (Exception e) {
		// 예외 처리 영역
		System.out.println("예외 처리");
	} finally {
		// 마무리 영역
		System.out.println("파일 종료");
	}
}

try catch문은 기본적으로 try 비즈니스 영역 catch 예외 처리 영역으로 구분되며, finally 마무리 영역을 추가하여 구성할 수 있다.

finally 마무리 영역은 에러가 나던 안 나던 무조건 실행되며, 예외와 상관없이 항상 실행해야 하는 코드가 있을 경우 작성하나, 대체로 사용도가 떨어지는 편이다.

위 소스코드는 try 비즈니스 영역 를 실행한 뒤, finally 마무리 영역을 실행하고 종료한다. 만약 비즈니스 영역을 실행하던 중 오류가 나면 catch 예외 처리 영역을 실행한 뒤 마무리 영역이 실행된다.

 

💡다중 캐치문


private static void tryCatchs() {
	try {
		// 0으로 나누기 > ArithmeticException
		int num = 10;
		System.out.println(100 / num);
		
		// 배열 첨자 > ArrayIndexOutOfBoundsException
		int[] nums = new int[3];
		nums[0] = 10;
				
		// 널참조 > NullPointerException
		Scanner scan = null;
		scan.nextLine();
	} catch (ArithmeticException e) {
		System.out.println("0으로 나누기");
	} catch (ArrayIndexOutOfBoundsException e) 
		System.out.println("배열 첨자");
	} catch (NullPointerException e) {
		System.out.println("널참조");
	} catch (Exception e) {
		System.out.println("예외 처리");
	}
}

예측 가능한 에러들을 묶어 다중 캐치문을 작성할 수 있다.

각 부분에서 에러가 발생하는 경우, 발생하는 에러 메시지를 catch 절로 던져서 해당하는 게 있는지 확인한다.

이러한 과정은 공(에러 메시지)을 던지면 catch 절에서 잡는다고 이해하면 편하다.

 

catch 절의 마지막에는 Exception e는 미리 준비하지 못한 예외처리가 발생한 경우에 사용한다. 이를 if문으로 치면 else 절로 볼 수  있으며, 공이 마지막 사람에게 온 것을 의미한다.

Exception e는 자세한 예외처리는 못 하더라도 예상하지 못한 에러에 대한 두루뭉실한 예외처리가 가능하다. 또한 이 캐치절은 모든 에러를 잡기 때문에 위로 올라가서는 안 된다.

 

💡예외 던지기


private static void throwException() {
	int num = 10;
	
	try {
		if (num % 2 == 1) {
			throw new Exception(); // 예외 던지기
		}
		System.out.println("업무 진행..");
	} catch (Exception e) {
		System.out.println("예외 처리..");
		System.out.println(e.getMessage());
	}
}

숫자를 입력받아 처리하는데 반드시 짝수만 입력하게 하고, 홀수를 입력받을 경우 에러 처리를 한다고 하자.

throw new Exception();

 

이때 홀수일 경우 에러 던지기를 하여 예외처리가 가능하다. 예외 던지기 구문의 throw에는 s가 없으니 주의한다.

이 구문을 만나는 순간! 자바는 냅다 catch 절로 이동한다.

예외 던지기를 하면 프로그램 흐름을 변경하여 특정 조건에 따라 다른 코드 블록이 실행되도록 할 수 있다.

 

💡예외 미루기


private static void m5() throws Exception {

}

예외 미루기(throws Exception)를 하면 실행 중인 메서드에서 예외를 처리하지 않고 상위 호출자로 예외를 전달할 수 있다.

단, 예외 미루기는 main 메소드에서는 절대 하지 않도록 한다. main메소드마저 예외를 미뤄버리면 더이상 처리할 수 있는 부분이 없기 때문이다.

 

💡try catch Edit Template


Pattern 수정

System.out.println("at ${primary_type_name}.${enclosing_method}");

e.printStackTrace();

 

try 입력 > Ctrl + Space 단축키를 누르면 자동으로 try catch 구문이 만들어진다.

그러나 catch 구문을 만들기만 하고 아무 것도 작성하지 않는다면 에러가 발생하는데도 발생 원인을 모를 수 있다.

그러므로 Edit Template에서 Pattern을 수정해주면 자동으로 내용이 작성되므로 개발자는 에러가 발생했음을 인지할 수 있다.