JAVA

자바 예외 처리 — 프로그램이 죽지 않게 대비하기(TRY·CATCH)

PANCO_IT
#자바#JAVA#예외처리#try-catch#오류

예외 처리가 없을 때와 try-catch를 쓸 때를 비교한 그림

예외 처리는 오류가 나도 프로그램이 죽지 않게 받쳐 주는 안전망입니다.

JAVA3 시즌에 오신 것을 환영합니다. 기초(JAVA1)와 객체지향(JAVA2)을 지나, 이제 실전에서 꼭 필요한 고급 주제로 들어갑니다. 첫 주제는 예외 처리입니다. 배열에서 없는 칸을 읽거나 0으로 나눌 때 프로그램이 통째로 멈추는 걸 본 적 있으시죠. 그 "멈춤"에 대비하는 법을 배웁니다.

예외가 뭔가요?

예외(Exception)는 프로그램 실행 중에 일어나는 예상 밖의 문제입니다. 문법이 틀린 게 아니라, 문법은 맞는데 실행하다 보니 곤란한 상황을 만난 것입니다.

지금까지 만난 것들이 전부 예외였습니다.

  • 10 / 0 — 0으로 나누기 (ArithmeticException)
  • nums[5] — 5칸 배열의 없는 칸 읽기 (ArrayIndexOutOfBoundsException)
  • new 없이 객체 사용 — 실물 없는 이름표 (NullPointerException)

쉽게 — 자동차의 에어백과 같습니다. 사고(예외)가 안 나는 게 최선이지만, 났을 때 **에어백(catch)**이 있으면 탑승자(프로그램)는 살아남습니다. 에어백이 없으면 사고 한 번에 끝나는 것이고요. 예외 처리는 "사고가 나도 살아남게" 만드는 안전 장치입니다.

처리하지 않으면 어떻게 되나요?

예외가 나는 순간, 자바는 프로그램을 그 자리에서 강제 종료합니다. 뒤에 남은 코드는 실행되지 않습니다.

int[] nums = {10, 20, 30};
System.out.println(nums[5]);          // 여기서 예외 발생 → 종료
System.out.println("이 줄은 실행 안 됨");

연습 코드라면 다시 실행하면 그만이지만, 실제 서비스라면 사용자 화면이 통째로 꺼지는 셈입니다. 그래서 "오류가 날 수 있는 곳"에는 안전망을 쳐 둡니다.

try-catch — 시도하고, 붙잡는다

안전망의 기본 구조는 두 블록입니다. try 안에 오류가 날 수 있는 코드를 넣고, catch에서 예외를 붙잡아 대신할 동작을 정합니다.

try {
    int[] nums = {10, 20, 30};
    System.out.println(nums[5]);       // 예외 발생!
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("없는 칸입니다. 인덱스를 확인하세요.");
}
System.out.println("프로그램은 계속 진행됩니다.");

예외가 나면 try의 남은 부분을 건너뛰고 catch로 점프합니다. 그리고 중요한 것 — 프로그램이 죽지 않고 다음 코드로 이어집니다. catch 괄호의 e에는 무슨 일이 났는지 정보가 담겨 있어, e.getMessage()로 원인을 확인할 수도 있습니다.

try, catch, finally 세 블록의 역할

그림 1. try(시도) → 예외가 나면 catch(붙잡기) → finally(항상 마무리).

finally — 나든 안 나든, 항상

finally 블록은 예외가 나든 안 나든 반드시 실행됩니다. 파일 닫기, 연결 정리처럼 "무슨 일이 있어도 해야 하는 마무리"를 넣는 자리입니다.

try {
    System.out.println(10 / 0);        // 예외 발생
} catch (ArithmeticException e) {
    System.out.println("0으로는 나눌 수 없습니다.");
} finally {
    System.out.println("마무리 작업은 항상 실행됩니다.");
}

정리하면 세 박자입니다. try(시도) → catch(붙잡기) → finally(항상 마무리). catch와 finally는 상황에 맞게 골라 쓰되, try 혼자서는 못 쓰고 둘 중 하나는 함께해야 합니다.

단골 함정 — 붙잡고 아무것도 안 하기

예외 처리에서 가장 흔한 나쁜 습관이 있습니다. catch 블록을 비워 두는 것입니다.

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    // 아무것도 안 함 ← 최악의 습관
}

이러면 프로그램은 안 죽지만, 문제가 생겼다는 사실 자체가 조용히 사라집니다. 어디서 뭐가 잘못됐는지 아무도 모르게 되죠. 병원 경보기를 꺼 버리는 것과 같습니다. catch에서는 최소한 무슨 일이 났는지 알리거나(메시지·로그), 대신할 동작을 정해야 합니다.

또 하나, 예외 처리는 만능이 아닙니다. 애초에 nums.length로 범위를 확인하고, 0인지 검사하고 나누는 예방이 먼저입니다. try-catch는 "예방으로 못 막는 상황"을 위한 마지막 안전망으로 쓰는 것이 좋은 설계입니다.

직접 실행해 보기

아래 코드를 돌려 보고, 배열 인덱스를 바꾸거나 나누는 수를 0이 아닌 값으로 바꿔 흐름이 어떻게 달라지는지 확인해 보세요.

try-catch-finally 안전망
public class Main {
  public static void main(String[] args) {
      int[] nums = {10, 20, 30};

      try {
          System.out.println(nums[5]);   // 없는 칸 → 예외 발생
      } catch (ArrayIndexOutOfBoundsException e) {
          System.out.println("없는 칸입니다: " + e.getMessage());
      } finally {
          System.out.println("finally는 항상 실행됩니다.");
      }

      System.out.println("프로그램은 계속 진행됩니다.");
  }
}

📱 코드 실행(실습)은 태블릿·PC에서 이용할 수 있어요. 모바일에서는 위 코드를 눈으로 따라가며 확인하세요.

한 장 정리

키워드역할
예외실행 중 만나는 예상 밖의 문제(0 나누기·범위 밖 등)
try오류가 날 수 있는 코드를 감싸는 블록
catch예외를 붙잡아 대신할 동작 실행
finally예외 여부와 상관없이 항상 실행
나쁜 습관catch 비워 두기(문제를 조용히 삼킴)

이것만 기억하면 됩니다. 예외는 실행 중의 사고이고, 처리하지 않으면 프로그램이 그 자리에서 죽습니다. try로 감싸고 catch로 붙잡아 대신할 동작을 정하면 프로그램이 계속 살아갑니다. 단, catch를 비워 두면 문제를 숨기는 꼴이 되니, 반드시 알리거나 대응하세요.

미니 퀴즈

개념을 제대로 잡았는지 직접 풀어 봅니다. 정답은 눌러야 나옵니다.

미니 퀴즈

OX 2문제 + 4지선다 3문제


포켓코딩(JAVA3) 1편 · 예제 출처: 강사 개인 GitHub 저장소. 다음 편: 여러 예외 다루기 — 다중 catch와 예외 던지기(throw).

PANCO_IT

IT 지식을 정리하는 개발자

관련 글