오류와 예외는 JAVA 프로그램 실행 중 발행할 수 있는 문제점들을 나타내지만, 그 성격과 대응 방법에 있어서 차이가 있다.
try {
// 예외 발생 가능 코드
} catch (ExceptionType e) {
// 예외 처리 코드
} finally {
// 리소스 해제 등의 정리 코드
}
여기서 return이 catch블록이나 finally블록에 있는 경우에는 어떻게 될까?
먼저 catch 블록안에 return문이 있는 경우이다.
public class CatchReturnExample {
public static int testMethod(int num) {
try {
System.out.println("Inside try block");
if( num == 1 ) {
throw new RuntimeException("Test Exception");
}
} catch (RuntimeException e) {
System.out.println("Inside catch block");
return 1;
} finally {
System.out.println("Inside finally block");
}
return 0;
}
public static void main(String[] args) {
int result = testMethod(1);
System.out.println("Result: " + result);
int result2 = testMethod(2);
System.out.println("Result: " + result2);
}
}
실행 결과
Inside try block
Inside catch block
Inside finally block
Result: 1
Inside try block
Inside finally block
Result: 0
위 처럼 catch블록이 실행되도록 RuntimeException의 예외를 발생 시킨 경우에 catch 블록에서 return을 실행했지만 finally 블록이 실행 된 후에 catch블록에서의 return 값인 1을 리턴하게 된다.
그럼 아래처럼 finally 블록안에 return문이 있는 경우에는 어떻게 실행될까?
public class CatchReturnExample {
public static int testMethod(int num) {
try {
System.out.println("Inside try block");
if( num == 1 ) {
throw new RuntimeException("Test Exception");
}
} catch (RuntimeException e) {
System.out.println("Inside catch block");
return 1;
} finally {
System.out.println("Inside finally block");
return 2;
}
}
public static void main(String[] args) {
int result = testMethod(1);
System.out.println("Result: " + result);
int result2 = testMethod(2);
System.out.println("Result: " + result2);
}
}
출력 결과
Inside try block
Inside catch block
Inside finally block
Result: 2
Inside try block
Inside finally block
Result: 2
소스 코드를 보면 finally 블록 내에 return문이 있고 catch문 안에도 return문이 있다. 하지만 출력 결과는 catch 블록을 실행하든 하지않든, return 값은 2로 finally 블록에서 리턴하도록 되어있다.
finally 블록에서 return을 사용하는 것은 특별한 경우를 제외하고는 권장되지 않는다. 이는 try 또는 catch 블록의 return 문을 덮어쓰기 때문에 코드의 흐름을 예측하기 어렵게 만들고, 따라서 버그의 원인이 될 수 있기 때문이다. 가능한 한, 모든 메소드에서 단일 return 지점을 유지하는 것이 좋은 프로그래밍 습관이기 때문에, 소스는 보기 편하도록 짜는 습관을 들이도록 하자.
if (someCondition) {
throw new ExceptionType("Error Message");
}