예외 처리 (Exception Handling) – 안정적인 코드를 작성하는 법

2024. 11. 18. 15:49·프로그래밍 언어/Java
728x90

예외 처리 (Exception Handling)

예외(Exception)란 무엇인가?

프로그램 실행 중에 발생할 수 있는 비정상적인 상황을 의미한다. 예를 들어, 배열의 인덱스를 초과해서 접근하려는 시도, 파일이 없을 때 파일을 읽으려는 시도 등이 예외 상황에 해당한다.

  • Checked Exception: 컴파일 시점에 발생 가능성을 컴파일러가 확인해야 하는 예외. 예: IOException, SQLException.
  • Unchecked Exception: 런타임에서만 확인되는 예외. 예: NullPointerException, ArrayIndexOutOfBoundsException.

예외처리가 java에서 중요한 이유는 아래와 같다.

 

  • 프로그램 안정성
    • 예외를 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있다.
  • 사용자 경험 개선
    • 사용자에게 친숙한 오류 메시지나 대체 작업을 제공할 수 있다.
  • 디버깅 용이성
    • 적절한 예외 처리는 문제가 발생한 원인을 추적하고 해결하기 쉽게 만든다.

예외 처리의 구조

try-catch-finally 블록의 사용

 

  • try 블록: 예외가 발생할 가능성이 있는 코드를 감싸는 블록이다.
  • catch 블록: try에서 발생한 예외를 처리한다.
  • finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 블록이다. 주로 리소스 정리 용도로 사용한다.
public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 예외 발생
        } catch (ArithmeticException e) {
            System.out.println("예외 발생: " + e.getMessage());
        } finally {
            System.out.println("프로그램 종료");
        }
    }
}
/* 출력
예외 발생: / by zero
프로그램 종료
*/

 

 

throw와 throws 키워드의 차이

 

  • throw: 특정 예외를 명시적으로 발생시킬 때 사용한다.
     
if (value < 0) {
    throw new IllegalArgumentException("음수는 허용되지 않습니다.");
}

 

  • throws: 메서드가 호출자에게 예외를 전달할 수 있음을 선언한다.
public void readFile() throws IOException { // IOException 발생 가능 }

예외 처리의 종류

체크 예외와 언체크 예외의 차이

  • Checked Exception:
    • 컴파일러가 예외 처리를 강제한다.
    • 예: IOException, SQLException.
    • 사용 시점: 외부 리소스(파일, 네트워크 등)와 상호작용 시.
  • Unchecked Exception:
    • 컴파일러가 처리 여부를 확인하지 않는다.
    • 예: NullPointerException, ArithmeticException.
    • 사용 시점: 주로 프로그래머의 실수로 발생.

자주 발생하는 예외 종류

NullPointerException: 객체가 null인 상태에서 메서드나 필드에 접근하려 할 때 발생한다.

String text = null;
System.out.println(text.length()); // 예외 발생

IOException: 입출력 작업 중 문제가 발생할 때 발생한다.

BufferedReader br = new BufferedReader(new FileReader("nonexistent.txt")); // 예외 발생

ArrayIndexOutOfBoundsException: 배열의 인덱스를 초과하려고 할 때 발생한다.

 
int[] numbers = {1, 2, 3};
System.out.println(numbers[3]); // 예외 발생

질문

Error와 Exception의 차이는 무엇인가요?

  • Error는 실행 중 일어날 수 있는 애플리케이션에서 복구할 수 없는 심각한 문제를 말합니다.
    • 컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되며 개발자가 직접 처리하거나 예측하기 어려운 상황 UncheckedException에 속합니다. 
    • 런타임에서 실행 시 발생되며 전부 예측 불가능한 Unchecked Error에 속한다.
    • ex) OutOfMemoryError, StackOverflowError, VirtualMachineError.
  • Exception:
    • Exception은 애플리케이션에서 발생하는 문제로, 개발자가 적절히 처리하여 복구할 수 있습니다.
    • 일반적인 실행 오류를 나타내며, 명시적으로 예외 처리를 구현할 수 있습니다.
    • ex)  IOException, NullPointerException, ArithmeticException.

Checked Exception과 Unchecked Exception의 차이점은 무엇인가요?

  • Checked Exception:
    • 컴파일 타임에 체크되는 예외로, 반드시 예외 처리를 해야 합니다.
    • 예외 처리(try-catch 또는 throws)가 없으면 컴파일 오류가 발생합니다.
    • 예: IOException, SQLException.
    • 장점: 예외 처리가 강제되므로 안정성이 높습니다.
    • 단점: 코드를 복잡하게 만들 수 있습니다.
  • Unchecked Exception:
    • 런타임에 발생하며, 예외 처리가 강제되지 않습니다.
    • RuntimeException을 상속받은 클래스들이 해당됩니다.
    • 예: NullPointerException, IndexOutOfBoundsException.
    • 장점: 예외 처리가 강제되지 않아 코드가 간결해집니다.
    • 단점: 예외 처리가 누락될 위험이 있습니다.

커스텀 예외(Custom Exception)를 설계해야 하는 이유와 방법은 무엇인가요?

이유

 

  • 기존 예외 클래스는 특정 비즈니스 로직에 적합하지 않을 수 있습니다.
  • 사용자 정의 예외를 통해 문제를 더 구체적으로 설명할 수 있습니다.
  • 코드의 가독성과 유지보수성을 높여줍니다.
  • 특정 도메인에 특화된 예외 처리를 명확히 할 수 있습니다.

방법

 

  • Exception 또는 RuntimeException을 상속받습니다.
  • 예외 메시지를 전달할 생성자를 작성합니다.
  • 필요에 따라 추가적인 데이터를 포함하는 필드를 정의합니다.
  • 예외 로깅과 디버깅을 용이하게 하기 위해 super 메서드와 연동합니다.

 

 

이외

  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
try: 예외가 발생할 가능성이 있는 코드를 작성합니다.
catch: 발생한 예외를 잡아 처리합니다.
throw: 명시적으로 예외를 발생시킬 때 사용합니다.
throws: 메서드에서 예외를 호출자에게 전달할 때 선언합니다.
finally: 예외 발생 여부와 상관없이 항상 실행되는 블록입니다.
  • 자바가 제공하는 예외 계층 구조
Throwable
 ├── Error (복구 불가)
 │    ├── OutOfMemoryError
 │    ├── StackOverflowError
 │    └── VirtualMachineError
 └── Exception (복구 가능)
      ├── IOException (Checked)
      ├── SQLException (Checked)
      └── RuntimeException (Unchecked)
           ├── NullPointerException
           ├── ArrayIndexOutOfBoundsException
           └── ArithmeticException
  • RuntimeException과 RuntimeException가 아닌 것의 차이는?
RuntimeException:런타임 시점에서 발생하며, 명시적 예외 처리가 강제되지 않습니다.예: IllegalArgumentException, NullPointerException.주로 프로그래밍 실수로 인해 발생합니다.
RuntimeException가 아닌 것 (Checked Exception):컴파일 타임에 처리 여부를 검사하며, 예외 처리가 강제됩니다.예: IOException, SQLException.주로 외부 리소스(파일, 네트워크 등)와 관련된 오류입니다.

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'프로그래밍 언어 > Java' 카테고리의 다른 글

자바의 장단점을 알아보자.  (1) 2024.11.19
캡슐화와 은닉화의 차이 - 객체지향 프로그래밍(OOP)의 기본 원칙  (0) 2024.11.19
자바 람다와 스트림 – 효율적인 코드 작성  (2) 2024.11.09
자바 컬렉션 프레임워크 – 자바에서 데이터를 다루는 방법  (1) 2024.11.09
제네릭 타입 (Generic Types) – 자바에서 타입 안정성을 확보하다  (2) 2024.11.08
'프로그래밍 언어/Java' 카테고리의 다른 글
  • 자바의 장단점을 알아보자.
  • 캡슐화와 은닉화의 차이 - 객체지향 프로그래밍(OOP)의 기본 원칙
  • 자바 람다와 스트림 – 효율적인 코드 작성
  • 자바 컬렉션 프레임워크 – 자바에서 데이터를 다루는 방법
pink_salt
pink_salt
유익함을 주는 개발자가 되도록 keep going
  • pink_salt
    KeepGoingForever
    pink_salt
  • 전체
    오늘
    어제
    • 분류 전체보기 (117)
      • Project (7)
      • WEB study (3)
        • WEB(Springboot) (10)
        • Git, GitLab (13)
        • Clean code (1)
        • FrontEnd (3)
      • Study (21)
        • Algorithm (19)
        • 면접 준비 (2)
      • Cloud Computing (2)
        • AWS (2)
      • 프로그래밍 언어 (35)
        • Java (29)
        • Python (0)
        • javascript (6)
      • 운영체제 (0)
        • Linux (0)
      • Database (4)
        • MongoDB (8)
        • SQL (8)
      • 애플리케이션 개발 (1)
        • Android (1)
      • AI (1)
        • Deeplearning (1)
        • machinelearning (0)
      • Daily (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    python
    MongoDB
    git branch
    dp
    spring boot
    개념
    티스토리챌린지
    오블완
    백준
    Database
    Java
    무료IT교육
    SWEA
    코드프레소
    빅오표기법
    Git
    대외활동
    코딩이러닝
    gitlab
    SW
    코딩강의
    객체지향
    언어
    mysql
    무료코딩교육
    자바
    Query
    codepresso
    BFS
    IT교육
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
pink_salt
예외 처리 (Exception Handling) – 안정적인 코드를 작성하는 법
상단으로

티스토리툴바