Java

자바 예외 처리 try - catch - finally or Exception

상상모음 2025. 2. 18. 13:59

자바 예외처리는 프로그램실행 중 발생할 수 있는 오류(예외)를 처리하여

프로그램이 비정상적으로 종료되지 않도록 하는 기능이다.

신입개발자가 알아야 할 핵심적인 내용만 정리.

 

예외(Exception)란?

프로그램 실행 중 발생하는 오류.

예외가 발생하면 프로그램은 정상적인 흐름을 벗어나서 종료될 수 있음.

예외를 처리하면 프로그램이 계속 실행될 수 있도록 만들 수 있음.

 

예외의 종류

자바의 예외는 크게 **체크 예외(Checked Exception)**와 **언체크 예외(Unchecked Exception)**로 나뉜다.

 

 

체크 예외 (Checked Exception)

  • Exception 클래스를 상속받은 예외 중 RuntimeException을 제외한 것
  • 반드시 try-catch 또는 throws로 처리해야 함
  • 예) IOException, SQLException, FileNotFoundException 등

 

 

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            File file = new File("test.txt");
            FileReader reader = new FileReader(file); // FileNotFoundException 발생 가능
        } catch (IOException e) {
            System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
        }
    }
}

 

 

언체크 예외 (Unchecked Exception)

  • RuntimeException을 상속받은 예외
  • 개발자가 명시적으로 처리하지 않아도 됨 (컴파일러가 강제하지 않음)
  • 예) NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException 등

 

 

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        String text = null;
        System.out.println(text.length()); // NullPointerException 발생
    }
}

 

 

 

예외 처리 방법

① try-catch 문

  • 예외가 발생할 가능성이 있는 코드를 try 블록에 넣고, 예외 발생 시 catch 블록에서 처리
public class TryCatchExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // ArithmeticException 발생
        } catch (ArithmeticException e) {
            System.out.println("0으로 나눌 수 없습니다.");
        }
    }
}

 

② try-catch-finally

  • finally 블록은 예외 발생 여부와 관계없이 항상 실행됨 (리소스 정리 등에 사용)
public class TryCatchFinallyExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[3]); // ArrayIndexOutOfBoundsException 발생
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("배열 인덱스 초과!");
        } finally {
            System.out.println("예외 처리 종료");
        }
    }
}

 

③ throws 키워드

  • 메서드에서 예외를 직접 처리하지 않고 호출한 곳으로 넘김
public class ThrowsExample {
    public static void main(String[] args) throws Exception {
        checkFile();
    }

    public static void checkFile() throws IOException {
        FileReader file = new FileReader("test.txt"); // FileNotFoundException 발생 가능
    }
}

 

④ throw 키워드

  • 직접 예외를 발생시킬 때 사용
public class ThrowExample {
    public static void main(String[] args) {
        int age = -5;
        checkAge(age);
    }

    public static void checkAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("나이는 0보다 커야 합니다.");
        }
        System.out.println("나이: " + age);
    }
}

 

신입 개발자가 꼭 알아야 할 예외 처리 원칙

✅ 적절한 예외를 처리하되, 남용하지 않기
→ 불필요한 try-catch를 남발하면 코드가 지저분해짐

✅ catch 블록에서 예외 정보를 로깅하기
→ System.out.println(e.getMessage());보다는 Logger를 활용하는 것이 좋음

✅ finally에서 자원 해제하기
→ 파일, 데이터베이스 연결 등은 finally 블록에서 닫아줘야 함

✅ throws와 throw의 차이 이해하기
→ throws는 예외를 호출한 쪽으로 넘기고, throw는 예외를 직접 발생시킴

✅ 예외를 삼키지 말고, 의미 있는 메시지를 남기기

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    throw new RuntimeException("계산 중 오류 발생: " + e.getMessage());
}

✅ 예외가 발생하는 원인을 이해하기
→ 예외가 왜 발생했는지 분석하고, 이를 방지하는 코드 작성

 

결론

  • try-catch, throws, throw, finally의 개념을 이해하고 적절히 활용
  • 예외 처리는 필수가 아니라 필요할 때만
  • 예외 발생 시 원인 분석과 해결책을 고려하는 습관 들이기
  • 실무에서는 예외 로깅을 적극적으로 활용