본문 바로가기

Language/Java

[Java] Try-Catch 사용법(예제 포함) 및 주의점

반응형

Intro

자바에서 try-catch문은 예외 처리를 위해 사용되는 로직입니다.

애플리케이션을 실행 중에 발생할 수 있는 예상 가능/불가능한 상황의 예외 상황을 처리하지 않으면 프로그램은 비정상적으로 종료될 수 있기 때문에, 이에 대한 적절한 처리가 필요합니다.

 

try-catch문은 예외가 발생할 수 있는 부분을 감싸, 예외가 발생한 경우 이를 처리해 줍니다.

 

기본 구조

try {
    // 예외가 발생할 수 있는 코드
} catch (예외타입1 변수1) {
    // 예외타입1에 해당하는 예외가 발생한 경우 처리할 코드
} catch (예외타입2 변수2) {
    // 예외타입2에 해당하는 예외가 발생한 경우 처리할 코드
} finally {
    // 예외 발생 여부와 상관없이 항상 실행될 코드(선택적)
}

 

  1. try에는 예외가 발생할 수 있는 코드를 작성합니다.

  2. catch는 예외 타입에 해당하는 Exception이 발생한 경우 실행됩니다.
    catch는 여러개 사용될 수 있으며, 각각 다른 예외 타입을 처리할 수 있습니다.
    예외가 발생했을 때 해당 예외를 잡아내고 처리하는 역할을 담당합니다.

  3. finally는 선택적인 블럭으로 예외 발생 여부와 상관없이 항상 실행됩니다.

 

예시

  • 아래 예시는 두 개의 숫자를 입력받아 나눈 뒤 결과를 출력하는 예제입니다.
    그러나 입력값에 문제가 있을 경우(예: 0으로 나누기) 예외가 발생할 수 있습니다.
import java.util.Scanner;

public class TryCatchExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int num1 = scanner.nextInt();

            System.out.print("두 번째 숫자를 입력하세요: ");
            int num2 = scanner.nextInt();

            int result = num1 / num2;
            System.out.println("나눈 결과: " + result);
        } catch (ArithmeticException e) {
            System.out.println("0으로 나눌 수 없습니다.");
        } catch (Exception e) {
            System.out.println("예외가 발생했습니다: " + e.getMessage());
        } finally {
            scanner.close();
        }
    }
}

 

  • try블럭에서 `num1/num2` 를 계산하는 부분에서 `ArithmeticException`이 발생한다면,
    첫 번째 catch 블럭에서 이를 잡아내 "0으로 나눌 수 없습니다."라는 메시지를 출력합니다.
  • catch (Exception e) 은 모든 예외(Exception)을 처리하는 범용적인 예외 처리 매커니즘 입니다. ArithmeticException를 제외한 예외가 발생한 경우, 첫 번째 catch 블럭에서 잡아 내지 못하고 두 번째 catch 블럭에서 처리하게 됩니다.
  • 위에서 설명드렸던 finally 블럭은 예외 발생과 상관없이 실행되어 `scanner.close()` 메소드를 통해 입력 스트림을 닫습니다.

주의점

  • 예외 타입에 따른 순서: catch 블록은 위에서 아래로 순서대로 확인됩니다. 따라서 더 구체적인 예외 타입의 catch 블록부터 작성하는 것이 중요합니다. 만약 더 일반적인 예외 타입을 먼저 작성하면, 더 구체적인 예외 타입의 catch 블록은 실행되지 않을 수 있습니다.

  • 다중 catch 블록의 중복: 여러 개의 catch 블록을 사용할 때, 예외 타입이 서로 중복되지 않도록 해야 합니다. 중복된 예외 타입을 사용하면 컴파일 에러가 발생합니다.

  • catch (Exception e)와 같이 최상위 예외 타입을 사용하는 것은 예외 처리에 대한 정확한 정보를 어렵습니다.
    가능한한 구체적인 예외 타입을 사용하여 예외를 처리하고, 필요한 경우 예외 타입을 순차적으로 처리하는 방법을 구현하는 것이 좋습니다.

  • 예외 처리 후의 프로그램 흐름: 예외 처리 후에도 프로그램이 정상적으로 진행될 수 있도록 주의해야 합니다. catch 블록 내에서 예외를 처리한 뒤, 프로그램의 흐름이 예상대로 진행되도록 합니다.

  • 자원 해제: finally 블록은 자원 해제와 관련된 작업에 사용될 수 있습니다. finally 블록 내에서 열린 리소스를 해제하고 클린 작업을 수행하는 것이 좋습니다. 이렇게 하면 예외가 발생하더라도 리소스 누수를 방지할 수 있습니다.
반응형