최근 요청받은 서버 API를 작성하다가 try-catch 구문에서 return문을 어디에 작성해야 하는지, 구체적으로는 finally에 작성해야 하는지에 대해 얘기하다 혼동이 와서 이 글을 작성하게 되었습니다.
_____
메소드 작성 시 예외 처리를 위해[1] try-catch 구문을 사용하곤 한다. 한편 리턴 타입이 void가 아니라면 값을 반환해주어야 한다. 그렇다면 return문은 어디에 작성되어야 할까? 먼저 지역변수를 사용하여 try-catch 구문 밖에 return문을 위치시키는 경우부터 코드로 확인해보았다.
public static void main(String[] args) {
System.out.println(method(null));
System.out.println("==========");
System.out.println(method("A"));
System.out.println("==========");
System.out.println(method("B"));
System.out.println("==========");
System.out.println(method("C"));
System.out.println("==========");
}
private static String method(String param) {
String result = param;
try {
if (result == null || "B".equals(result)) {
throw new NullPointerException();
}
if ("A".equals(result)) {
return result;
}
} catch (NullPointerException e) {
System.out.println("catch절");
if ("B".equals(result)) {
return result;
}
} finally {
System.out.println("finally절");
// return "C"; // [2]
}
return "C";
}
실행 결과는 다음과 같고, 원하는 결과가 나옴을 알 수 있다.
catch절
finally절
C
==========
finally절
A
==========
catch절
finally절
B
==========
finally절
C
==========
null을 파람으로 던지는 경우를 보면, 예외 발생 시 값을 리턴할 경우 try-catch문 밖에 리턴문을 위치시키면 됨을 알 수 있다. 반면 finally 내부에 return문을 위치시키는 경우 결과는 하단과 같다[2].
_____
2.
catch절
finally절
C
==========
finally절
C
==========
catch절
finally절
C
==========
finally절
C
==========
_____
참고
1. How to return a value from try, catch, and finally?
2. 메소드 내 예외처리(try-catch-finally)에서의 리턴 처리
3.
댓글