나를 기록하다
article thumbnail
Published 2023. 8. 26. 16:37
[Java] 예외 처리 Java
반응형

나는 자바로 알고리즘 공부를 한다.
알고리즘 문제를 풀 때 BufferedReader와 InputStreamReader를 자주 사용하는데, 습관처럼 메인 메서드에 IOException을 던져준다.
(throws IOException을 처리하지 않으면 동작이 되지 않기 때문이다.)
오늘은 알고리즘 공부를 하다가 문득 내가 왜 이걸 처리하는지와 왜 이런 예외가 발생하는 이유, throws IOException이 가지는 의미가 무엇인지 궁금해져서 찾아보고 공부한 내용을 블로그에 공유하고자 한다.

예외 처리

오류(error)와 예외(exception)

  1. 오류: 시스템 레벨에서 프로그램에 심각한 문제를 야기하여 실행 중인 프로그램을 종료시킴.
  2. 예외: 오류와 마찬가지로 실행 중인 프로그램을 비정상적으로 종료시키지만, 발생할 수 있는 상황을 미리 예측하여 처리 가능
    개발자는 예외 처리(exception handling)를 통해 예외 상황을 처리할 수 있도록 해야함

처리(exception handling) - try / catch / finally

try {

    예외를 처리하길 원하는 실행 코드;

} catch (e1) {

    e1 예외가 발생할 경우에 실행될 코드;

} catch (e2) {

    e2 예외가 발생할 경우에 실행될 코드;

}

...

finally {

    예외 발생 여부와 상관없이 무조건 실행될 코드;

}
  1. try block: 가장 처음 실행되는 코드, 여기서 발생한 예외는 catch block에서 처리
  2. catch block: try block에서 발생한 예외 코드나 예외 객체를 인수로 전달받아 그 처리를 담당
  3. finally block: try block에서의 예외와 상관없이 마지막에 무조건 실행

예외 처리 메커니즘 관련 이미지

예외 처리 메커니즘


예외 클래스(Exception Class)

예외 클래스

RuntimeException Class

  1. 상속받는 자식 클래스들은 주로 치명적인 예외 상황을 발생시키지 않는 예외들로 구성
    • try / catch문을 사용하기보다 프로그램을 작성하면서 예외가 발생하지 않도록 주의
  2. 그 외의 Exception Class: 치명적인 예외 발생시킴
    • 반드시 try / catch문을 사용하여 예외를 처리해야만 한다.
    • 자바 컴파일러는 RuntimeException Class 이외의 Exception Class의 자식 클래스에 속하는 예외가 발생할 가능성이 있는 구문에는 반드시 예외를 처리하도록 강제

Throwable Class

Throwable Class는 모든 예외의 조상이 되는 Exception 클래스와 모든 오류의 조상이 되는 Error 클래스의 부모 클래스.
Throwable 타입과 이 클래스를 상속받은 서브 타입만이 자바 가상 머신(JVM)이나 throw 키워드에 의해 던져질 수 있음.

메소드 설명
String getMessage() 해당 throwable 객체에 대한 자세한 내용을 문자열로 반환
void printStackTrace() 해당 throwable 객체와 표준 오류 스트림에서 해당 객체의 스택 트레이스를 출력
String toString() 해당 throwable 객체에 대한 간략한 내용을 문자열로 반환

예외 발생 및 회피

예외 발생시키기

  • throw 키워드를 사용하여 강제로 예외를 발생시킬 수 있음
Exception e = new Exception("오류메시지");

...

throw e;

예외 회피하기

  • 메서드 선언부에 throws 키워드를 사용하여 해당 메서드를 사용할 때 발생할 수 있는 예외를 미리 명시 가능
  • 이렇게 하면 해당 메서드를 사용할 때 발생할 수 있는 예외를 사용자가 인지 가능 및 그에 대한 처리까지 강제 가능

public class Exception03 {

static void handlingException() {

  try {

      throw new Exception();

  } catch (Exception e) {

      System.out.println("호출된 메서드에서 예외 처리");

  }

}

public static void main(String[] args) {

  try {

      handlingException();

  } catch (Exception e) {

      System.out.println("main() 메소드에서 예외 처리");

  }

}

}


- 실행 결과<br>

호출된 메서드에서 예외 처리

- 이때 호출된 메서드의 try / catch 문을 생략하면 컴파일 오류 발생
- 이 메서드를 호출한 main() 메서드는 호출된 메서드에서 예외가 발생한 사실을 알 수 없음<br>
---

public class Exception04 {

static void handlingException() throws Exception { throw new Exception(); }

public static void main(String[] args) {

try {

    handlingException();

} catch (Exception e) {

    System.out.println("main() 메서드에서 예외 처리");

}

}

}

main() 메서드에서 예외 처리
  • throws 키워드를 사용하여 호출된 메서드에서 발생한 예외를 호출한 메서드로 넘김
  • 호출된 메서드에는 try / catch 문 생략 가능
  • 호출된 메서드에서 발생한 예외를 해당 메서드를 호출한 main() 메서드에서 처리 가능

사용자 정의 예외 클래스

  • 사용자 정의 예외 클래스에는 생성자뿐만 아니라 필드 및 메서드도 원하는 만큼 추가 가능
    class MyException extends RuntimeException {
    
    
MyException(String errMsg) {

    super(errMsg);

}

}


---
## try-with-resources 문
<br>

try (파일을열거나자원을할당하는명령문) {
...

}

```

  • try block에 괄호를 추가하여 파일을 열거나 자원을 할당하는 명령문을 명시하면, 해당 try block이 끝나자마자 자동으로 파일을 닫거나 할당된 자원을 해제참고링크TCPschool
반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...