1. 왜 try-catch가 필요한가?
잘 아시다시피 프로그래밍에서는 오류가 끊임없이 발생합니다. 0으로 나누기, 잘못된 입력, 파일 부재 등. 이러한 상황을 처리하지 않으면 프로그램은 오류와 함께(비정상적으로) 종료됩니다.
try-catch 구문은 예외를 “잡아” 프로그램이 중단되는 것을 막고, 오류를 깔끔하게 처리할 수 있게 해 줍니다.
try-catch 구문의 문법
try
{
// 예외가 발생할 수 있는 코드
}
catch (TipIsklyucheniya imyaPeremennoy)
{
// 예외를 처리하는 코드
}
설명:
- try — “이 코드를 실행해 보라(시도해 보라)”.
- catch — “해당 타입의 예외가 발생하면 여기서 처리해라”.
어떻게 동작할까?
try 블록에서 예외가 발생하면 해당 블록의 실행은 즉시 중단되고, 제어는 첫 번째로 일치하는 catch 블록으로 넘어갑니다. 예외가 발생하지 않았다면 — catch 블록은 건너뜁니다.
2. 예시: 0으로 나누기
예외 처리가 없는 경우
int a = 10;
int b = 0;
int result = a / b; // 여기서 프로그램이 오류로 종료됩니다!
System.out.println("결과: " + result); // 여기까지는 실행되지 않습니다
결과:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:3)
try-catch로 처리한 경우
int a = 10;
int b = 0;
try
{
int result = a / b; // 여기서 예외가 발생할 수 있습니다
System.out.println("결과: " + result);
}
catch (ArithmeticException e)
{
System.out.println("오류: 0으로 나눌 수 없습니다!");
}
System.out.println("프로그램이 계속 실행되었습니다.");
결과:
오류: 0으로 나눌 수 없습니다!
프로그램이 계속 실행되었습니다.
설명:
- Java가 0으로 나누는 연산을 만나면 즉시 예외를 “던집니다”.
- try가 중단되고, 제어가 catch로 넘어갑니다.
- 오류를 처리한 뒤 프로그램은 계속 실행됩니다.
3. catch 블록은 어떻게 동작하나
catch 뒤의 괄호에는 예외 타입(예: ArithmeticException)과 변수 이름(보통 e)을 지정합니다.
catch 블록 내부에서는 오류에 대한 세부 정보를 확인할 수 있습니다:
- e.getMessage() — 오류의 간단한 설명.
- e.printStackTrace() — 상세 정보(디버깅용).
예시:
try
{
int[] arr = new int[2];
int x = arr[10]; // 오류: 해당 인덱스가 없습니다
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("오류: " + e.getMessage()); // 오류 메시지를 출력
e.printStackTrace(); // 오류에 대한 모든 정보를 콘솔에 출력
}
4. 예외 발생 시 실행 흐름
try 블록에 오류가 없다면 — catch 블록은 실행되지 않습니다.
try 블록에서 오류가 발생하면 — 오류 지점에서 블록의 실행이 중단되고, 제어는 즉시 첫 번째로 일치하는 catch로 넘어갑니다. try에서 오류 이후의 코드는 더 이상 실행되지 않습니다!
도식:
try
{
System.out.println("1. try 시작");
int a = 10 / 0; // 오류!
System.out.println("2. 나눗셈 이후"); // 실행되지 않음
}
catch (ArithmeticException e)
{
System.out.println("3. catch 블록에서");
}
System.out.println("4. try-catch 이후");
결과:
1. try 시작
3. catch 블록에서
4. try-catch 이후
5. try-catch 사용 시 흔한 실수
오류 1: 너무 광범위한 catch.
catch (Exception e)를 사용하면, 제대로 처리할 수 없는 예상치 못한 오류들까지 죄다 잡아버릴 수 있습니다.
해결: 이 지점에서 실제로 예상되는 예외만 잡으세요(예: IOException, SQLException).
오류 2: 빈 catch.
catch (Exception e) {}처럼 작성하는 것은 문제를 숨기는 것입니다. 프로그램이 다른 곳에서 죽거나 이상하게 동작할 수 있습니다.
해결: 최소한 오류를 기록하세요(e.printStackTrace() 또는 로거).
오류 3: try-catch가 모든 문제를 해결해 준다고 믿는 것.
프로그램 로직의 오류라면(예: 0으로 나누기, 잘못된 알고리즘) — 어떤 try-catch도 도움이 되지 않습니다.
해결: 버그를 감추기 위해서가 아니라 실제로 예상되는 상황에 대해서만 try-catch를 사용하세요.
GO TO FULL VERSION