Java 예외 처리 마스터: try-catch-finally, throw, throws 완전 정복
Java 예외 처리 마스터하기
이 가이드는 Java 예외 처리 메커니즘(try-catch, finally, throw, throws)을 명확한 예제와 모범 사례 팁으로 안내합니다.
이전 레슨에서 Java 예외와 프로그램 흐름 중단 이유를 소개했습니다. 그런 예외를 우아하게 처리하는 것은 견고하고 유지보수하기 쉬운 코드에 필수적입니다.
Java 예외 관리 주요 전략:
- try…catch 블록
- finally 블록
- throw와 throws 키워드
1. try…catch 블록 사용
try…catch 구문은 Java 에러 처리 모델의 초석. 예외 발생 가능 코드 try 블록에 배치, 이후 특정 예외 캐치.
try { // 예외 발생 가능 코드 } catch(Exception e) { // 예외 처리 }
catch 절은 try 블록 등장 시 필수; 예외 가로채 적절 대응 가능.
예제: ArithmeticException 처리
class Main { public static void main(String[] args) { try { int divideByZero = 5 / 0; System.out.println("Rest of code in try block"); } catch (ArithmeticException e) { System.out.println("ArithmeticException => " + e.getMessage()); } } }
출력
ArithmeticException => / by zero
이 스니펫에서 0으로 나누기 시 ArithmeticException 발생. 예외 캐치, catch 블록 실행, try 블록 내 예외 이후 코드 건너뜀.
try 블록이 예외 없이 완료되면 catch 블록 단순 우회.
2. finally 블록 활용
finally 블록은 예외 발생 여부와 관계없이 항상 실행. 정리 작업(파일 닫기, 리소스 해제, 로깅)에 이상적.
한 try 문에 finally 블록 하나만 동반 가능.
try { // 코드 } catch (ExceptionType1 e1) { // 처리 } finally { // 항상 실행 }
예제: 예외 후 finally
class Main { public static void main(String[] args) { try { int divideByZero = 5 / 0; } catch (ArithmeticException e) { System.out.println("ArithmeticException => " + e.getMessage()); } finally { System.out.println("This is the finally block"); } } }
출력
ArithmeticException => / by zero This is the finally block
finally 블록이 catch 블록 후 실행되어 예외 발생 시에도 중요 정리 코드 실행 보장.
모범 사례: 성공/실패와 무관하게 실행되어야 하는 코드(스트림 닫기, 공유 상태 리셋 등)에 finally 사용.
3. 명시적 예외 던지기와 throws 선언
throw 키워드로 예외 수동 발생 가능. 던져지면 제어가 가장 가까운 일치 catch 블록으로 점프.
예제: throw 사용
class Main { public static void divideByZero() { throw new ArithmeticException("Trying to divide by 0"); } public static void main(String[] args) { divideByZero(); } }
출력
Exception in thread "main" java.lang.ArithmeticException: Trying to divide by 0 at Main.divideByZero(Main.java:5) at Main.main(Main.java:9)
throws 절은 메서드가 특정 체크드 예외 전파 가능성 선언. 호출자가 처리하거나 추가 전파해야 함 알림.
예제: 파일 I/O에서 throws 사용
import java.io.*; class Main { // 이 메서드가 IOException 던질 수 있음 선언 public static void findFile() throws IOException { File newFile = new File("test.txt"); FileInputStream stream = new FileInputStream(newFile); } public static void main(String[] args) { try { findFile(); } catch (IOException e) { System.out.println(e); } } }
출력
java.io.FileNotFoundException: test.txt (The system cannot find the file specified)
파일 없으면 FileInputStream이 FileNotFoundException 던짐(IOException 하위 클래스). findFile()이 throws IOException 선언했으므로 main 메서드 처리 필수.
메서드 내부에서 예외 안 잡으면 throws로 선언해 호출자에게 잠재적 실패 알림.
더 깊은 통찰은 Java throw와 throws 문서 참조.