- 자바에서의 예외처리 (Exception Handling)2024년 12월 16일
- imaginaring
- 작성자
- 2024.12.16.:36
프로그램 실행 중 발생하는 비정상적인 상황을 자바에서는 어떻게 처리하는지 알아보자
일단 비정상적인 상황의 구분을 둔다면..
- Exception (예외)
- 프로그램 실행 중에 발생하는 문제로, 개발자가 처리할 수 있는 오류
- 예: 파일이 존재하지 않음, 네트워크 오류, 배열 인덱스 초과 등.
- Error (에러)
- 프로그램이 복구할 수 없는 심각한 문제로, 주로 JVM에서 발생
- OutOfMemoryError, StackOverflowError 등.
Exception 계층구조 Object └── Throwable ├── Error // 복구 불가능한 심각한 문제 └── Exception // 프로그램 실행 중 발생하는 예외 ├── RuntimeException // 실행 시점에 발생하는 예외 (Unchecked Exception) └── 기타 Exception // 컴파일 타임에 확인되는 예외 (Checked Exception)
- Checked Exception: 컴파일 시점에 처리해야 하는 예외.
- 예: IOException, SQLException
- Unchecked Exception: 실행 시점에 발생하는 예외.
- 예: NullPointerException, ArrayIndexOutOfBoundsException
try - catch - ?finally 를 사용해 예외처리
try { // 예외가 발생할 수 있는 코드 } catch (ExceptionType e) { // 예외가 발생했을 때 실행할 코드 } finally{ // 예외 발생 여부와 상관없이 반드시 실행되는 코드 // 주로 리소스 해제 (파일, 네트워크 연결 등)에 사용 }
** 예시 import java.io.FileInputStream; import java.io.IOException; public class FinallyExample { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("example.txt"); int data = fis.read(); System.out.println("파일 읽기 성공"); } catch (IOException e) { System.out.println("파일 읽기 오류: " + e.getMessage()); } finally { // 리소스 해제 try { if (fis != null) fis.close(); System.out.println("리소스 해제 완료"); } catch (IOException e) { System.out.println("리소스 해제 오류"); } } } }
// catch는 다중으로 사용이 가능하다 // 어떤 에러로 Exception을 발생시켰는지 확인가능 public class MultiCatchExample { public static void main(String[] args) { try { int num = Integer.parseInt("abc"); // NumberFormatException 발생 int result = 10 / 0; // ArithmeticException 발생 } catch (NumberFormatException e) { System.out.println("숫자 형식 오류"); } catch (ArithmeticException e) { System.out.println("산술 오류"); } } }
throws 키워드
- 메소드에서 예외를 호출한 곳으로 전달할 때 사용
- Checked Exception의 경우 throws를 통해 명시적 선언 필요.
import java.io.IOException; public class ThrowsExample { public static void main(String[] args) throws IOException { readFile(); } public static void readFile() throws IOException { throw new IOException("파일 읽기 실패"); } }
Custom Exception - 개발자가 Exception을 상속받아 직접 예외 클래스를 작성할 수 있다
class MyException extends Exception { public MyException(String message) { super(message); } } public class CustomExceptionExample { public static void main(String[] args) { try { validateAge(15); } catch (MyException e) { System.out.println(e.getMessage()); } } public static void validateAge(int age) throws MyException { if (age < 18) { throw new MyException("미성년자는 나가라."); } } }
try-with-resources (Java 7이상) - 리소스 자동 해제 가능
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class TryWithResourcesExample { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.out.println("파일 읽기 오류: " + e.getMessage()); } } }
정리
- try-catch: 예외를 처리하는 블록.
- finally: 예외 발생 여부와 관계없이 실행되는 블록.
- throws: 메소드에서 예외를 던지는 선언.
- try-with-resources: 리소스를 자동으로 닫아주는 문법.
- 사용자 정의 예외: 특정 상황에 대한 예외를 명확히 처리하기 위해 커스텀 예외를 정의.
- 모든 예외를 Exception으로 처리하지 말것, 문제의 원인을 파악하기 힘듬
- 예외를 정상적인 제어 흐름으로 사용하지 말것
- 잊지말고 리소스를 반드시 해제할것
'프로그래밍 > Java' 카테고리의 다른 글
제네릭 클래스 (0) 2024.12.16 자바 기초적인 내용들 (0) 2024.12.16 웹 애플리케이션 계층 구조 (0) 2024.12.16 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)