전공/객체지향프로그래밍

[객체지향프로그래밍][Java] Exception Handling

Campus Coder 2023. 6. 7. 23:11
728x90
반응형

Exception 종류

실행 중에 예기치 않은 상황이 발생할 때 사용

Exception 클래스와 그 하위 클래스

예외는 크게 두 가지 유형으로 분류 - Checked Exception, Unchecked Exception

 

Checked Exception

  • 컴파일러에 의해 강제로 처리해야 하는 예외
  • 반드시 try-catch 블록이나 throws 절로 예외 처리

Unchecked Exception

  • RuntimeException 클래스와 그 하위 클래스
  • 프로그램의 실행 중에 예기치 않은 상황에 발생
  • 예외가 발생하면 JVM이 예외를 캐치하여 적절한 예외 처리 코드를 실행하거나,
    예외를 런타임 환경으로 전파하여 프로그램의 실행을 중단

 

예외 전파

main - f1 - f2 - f3

f3에서 예외 발생 시 f3은 비정상 종료하고 f2로 예외를 던짐

f2는 예외를 받고 비정상 종료, f1로 예외를 던짐

main에서 예외를 받고 프로그램이 비정상 종료됨

 

Exception Handling

throw

  1. 예외 발생 - 프로그램이 실행 중에 여러 예외 상황이 발생하거나 throw를 사용하여 예외 발생
  2. 예외 객체 생성 - 예외가 발생하면 해당 예외를 표현하는 객체가 생성됨
  3. 예외 전달 - throw를 통해 프로그램의 실행흐름이 예외 처리 코드로 전달

try-catch

  1. 예외 처리 - 예외 발생한 코드를 감싸는 try 블록에서 예외를 catch 하는 catch 블록으로 제어가 이동
  2. 예외 정보 출력 - chtch 블록에서 예외 객체를 사용, 주로 getMessage() 메소드를 호출하여 예외 메시지를 가져와 출력

 

printStackTrace()

Throwable 클래스에 정의되어 있음

예외 객체에서 호출 가능

예외가 발생한 원인과 해당 예외를 호출한 메소드들의 스택 트레이스를 출력

  • 예외 메시지 - 예외 객체에 설정된 메시지가 출력
  • 예외 발생 경로 - 예외가 발생한 위치부터 예외 처리 코드까지의 호출 스택 출력, 메소드 호출의 연속으로 표시되며, 각각의 호출은 클래스, 메서드, 라인 번호 등의 정보를 포함
  • 예외 원인 - 예외 객체에 설정된 원인 예외(cause)가 있을 경우, 해당 예외의 스택 트레이스도 출력

 

getMessage() 

Throwable 클래스에 정의되어 있음

예외 상황에 대한 정보 포함

getMessage() 호출로 해당 예외 객체에 설정된 메시지 가져옴

 

예시

class Example {
    public void divide(int dividend, int divisor) {
        try {
            if (divisor == 0) {
                throw new ArithmeticException("0으로 나눌 수 없음");
            }

            int result = dividend / divisor;
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) {
            e.printStackTrace();
            System.err.println(e.getMessage()); // "0으로 나눌 수 없음" 출력
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Example example = new Example();
        example.divide(10, 0);  // 예외 발생
    }
}
java.lang.ArithmeticException: 0으로 나눌 수 없음
    at Example.divide(Main.java:5)
    at Main.main(Main.java:20)
0으로 나눌 수 없음

 

 

예외 상속

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

public class Main {
    public static void main(String[] args) {
        try {
            FileReader reader = new FileReader("some.txt"); // 예외 발생
            reader.close();
        } catch (IOException e) {
            String str = e.getMessage();
            System.err.println(str);
        }
    }
}
some.txt (No such file or directory)

 

public FileReader(String fileName) throws FileNotFoundException

public class FileNotFoundException extends IoException

 

이므로 catch (IOException e) 가능

 

 

try {
    FileReader reader = new FileReader("some.txt"); // 예외 발생
    reader.close();
} catch (IOException e) {
    System.err.println("입출력 에러가 발생했습니다.");
} catch (FileNotFoundException e) {
    System.err.println("파일을 찾을 수 없습니다.");
}

catch문의 순서는 하위 → 상위 순서로 배치

예외를 세분화 하여 처리할 수 있음

상위타입 변수로 만든 catch문이 예외를 모두 처리해서 아래에 위치한 catch문 실행 불가(컴파일 에러 발생)

 

예외 클래스 생성

public class CustomException extends RuntimeException {
    public CustomException() { super(); }
    public CustomException(String message) { super(message); }
    // 추가적인 메소드 또는 속성 정의 가능
}
  1. Exception 또는 RuntimeException 클래스를 상속
  2. 필요한 경우 생성자 정의, 부모 클래스의 생성자를 호출하여 최화
  3. 예외 클래스의 동작 재정의 가능

 

try-with-resources

try (리소스 선언) {
    // 리소스 사용 코드
} catch (예외 타입 예외변수) {
    // 예외 처리 코드
}
  • try블록을 벗어날 때 resource들이 자동으로 닫힘
  • catch절과 finally절은 옵션
  • resource는 AutoCloseable 인터페이스를 구현하는 클래스여야 함
  • 여러 개의 리소스는 ; 사용하여 구분, resource; resource

 

예시

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(new File("myNumbers"))) {
            while (sc.hasNextLong()) {
                long aLong = sc.nextLong();
            }
        } catch (IOException e) { // try 블록 끝나며 sc.close()
            System.err.println(e.getMessage());
        }
    }
}
myNumbers (No such file or directory)
728x90
반응형