결론부터 말하자면, try, catch, finally 블록 사이에는 어떠한 문장도 작성할 수 없습니다. 이 세 블록은 하나의 단위로 취급되기 때문입니다.
try, catch, finally의 역할
각 블록은 다음과 같은 고유한 기능을 수행합니다.
- try 블록: 예외 객체를 식별하고, 해당 예외 객체를 포착한 후 try 블록의 실행을 일시 중단하면서 식별된 예외 객체와 함께 제어 흐름을 catch 블록으로 전달합니다.
- catch 블록: try 블록에서 전달받은 예외 클래스 객체를 수신하고, catch 블록 내에 정의된 해당 예외 클래스의 참조 변수에 그 객체를 할당합니다.
- finally 블록: 예외 발생 여부와 관계없이 반드시 실행되는 블록입니다.
가능한 조합과 컴파일 오류
Java에서는 다음과 같은 조합으로 예외 처리 코드를 작성할 수 있습니다.
- try + catch 블록
- try + 다중 catch 블록
- try + finally 블록
- try + catch + finally 블록
하지만 이러한 블록들 사이에는 어떤 코드나 문장도 넣을 수 없습니다. 만약 블록 사이에 문장을 삽입하려고 하면 컴파일 타임 오류(compile-time error)가 발생합니다.
문법(Syntax)
try
{
// 예외 발생 여부를 감시할 문장들
}
// 이 위치에는 어떤 문장도 작성할 수 없음
catch(Exception ex){
// 여기서 예외를 포착하여 처리
}
// 이 위치에는 어떤 문장도 작성할 수 없음
finally{
// finally 블록은 선택 사항이며, try 또는 try-catch 블록이 존재할 때만 사용 가능
// try 블록에서 예외가 발생했는지, 그리고 발생한 예외가 catch 블록에서
// 처리되었는지와 무관하게 항상 실행됨
// 단, System.exit() 호출 시나 Error가 발생한 경우에는 실행되지 않음
}예제 코드
public class ExceptionHandlingTest {
public static void main(String[] args) {
System.out.println("여기에는 원하는 만큼의 문장을 자유롭게 작성할 수 있습니다");
try {
int i = 10/0; // 이 문장은 ArithmeticException을 발생시킴
System.out.println("이 문장은 실행되지 않습니다");
}
// 여기에는 문장을 작성할 수 없음
catch(ArithmeticException ex){
System.out.println("예외가 발생하면 이 블록이 즉시 실행됩니다");
}
// 여기에는 문장을 작성할 수 없음
finally {
System.out.println("이 블록은 항상 실행됩니다");
}
System.out.println("여기에는 원하는 만큼의 문장을 자유롭게 작성할 수 있습니다");
}
}실행 결과
여기에는 원하는 만큼의 문장을 자유롭게 작성할 수 있습니다 예외가 발생하면 이 블록이 즉시 실행됩니다 이 블록은 항상 실행됩니다 여기에는 원하는 만큼의 문장을 자유롭게 작성할 수 있습니다
정리
try, catch, finally는 하나의 예외 처리 단위로 묶여 있으므로 블록 사이에 별도의 문장을 삽입할 수 없습니다. 다만 try 블록 앞이나 전체 블록이 끝난 후에는 자유롭게 코드를 작성할 수 있다는 점을 기억해 두면 좋습니다.