Exception 예외처리

duckbill413·2023년 8월 15일
0

Java

목록 보기
5/5

Exception

Exception handling (예외 처리)

에러와 예외

  • 어떤 원인에 의해 오동작 하거나 비정상적으로 종료되는 경우
  • 심각도에 따른 분류
    • Error
      • 메모리 부족, stack overflow와 같이 일단 발생하면 복구할 수 없는 상황
      • 프로그램의 비 정상적 종료를 막을 수 없음 → 디버깅 필요
    • Exception
      • 읽으려는 파일이 없거나 네트워크 연결이 안 되는 등 수습될 수 있는 비교적 상태가 약한 것들
      • 프로그램 코드에 의해 수습될 수 있는 상황
  • exception handling(예외 처리)
    • 예외 발생 시 프로그램의 비 정상 종료를 막고 정상적인 실행 상태를 유지하는 것
      • 예외의 감지 및 예외 발생 시 동작할 코드 작성 필요

예외 클래스의 계층

  • Non-RuntimeException
    • 예외에 대한 대처 코드가 없으면 컴파일이 진행되지 않음
  • RuntimeException (RuntimeException
    의 하위 클래스)
    - 예외에 대한 대처 코드가 없더라도 컴파일은 진행됨

try ~ catch 구문

public static void main(String[] args) {
		int[] intArray = { 10 };
		try {
				System.out.println(intArray[2]);
		catch (ArrayIndexOutOfBoundsException e) {
				System.out.println("예외가 발생했지만 처리함: 배열 크기 확인 필요");
		}
		System.out.println("프로그램 종료합니다.");
}

Exception 객체의 정보 활용

  • Throwable의 주요 메서드

try-catch문 에서의 흐름

  • try 블록에서 예외가 발생하면
    • JVM이 해당 Exception 클래스의 객체 생성 후 throw
      • throw new XXException
    • throw된 exception 을 처리할 수 있는 catch 블록에서 받은 후 처리
      • 적당한 catch 블록을 만나지 못하면 예외 처리는 실패
    • 정상적으로 처리되면 try-catch 블록을 벗어나 다음 문장 진행
  • try 블록에서 어떠한 예외도 발생하지 않은 경우
    • catch 문을 거치지 않고 try-catch 블록의 다음 흐름 문장을 진행

다중 exception handling

  • try 블록에서 여러 종류의 예외가 발생한 경우
    • 하나의 try 블록에 여러 개의 catch 블록 추가 가능
      • 예외 종류별로 catch 블록 구성
        • 오른쪽 코드의 경우 Exception에서 모든 예외를 처리하게 됨으로 Unreachable catch Exception이 발생!
  • 다중 catch 문장 작성 순서 유의 사항
    • JVM이 던진 예외는 catch문장을 찾을 떄는 다형성이 적용됨
    • 상위 타입의 예외가 먼저 선언되는 경우 뒤에 등장하는 catch 블록은 동작할 기회가 없음
      • Unreachable catch block for Exception의 컴파일 에러 발생
    • 상속 관계가 없는 경우는 무관
    • 상속 관계에서는 작은 범위(자식)에서 큰 범위(조상)순으로 정의

try~catch~finally 구문을 이용한 예외 처리

  • finally는 예외 발생 여부와 상관 없이 언제나 실행
    • 중간에 return을 만나는 경우도 finally 블록을 먼저 수행 후 return 실행

try-with-resources

try-with-resources

  • JDK 1.7 이상에서 리소스의 자동 close 처리
    try (리소스_타입1 res = 초기화; 리소스_타입2 res2 = 초기화;...) {
    
    } catch (Exception e) {
    
    }
  • try 선언문에 선언된 객체들에 대해 자동 close 호출 (finally 역할)
    • 단 해당 객체들이 AutoCloseable interface를 구현할 것
      • 각종 I/O stream, socket, connection …
    • 해당 객체는 try 블록에서 다시 할당될 수 없음

throws 활용

throws 키워드를 통한 처리 위임

  • method에서 처리해야 할 하나 이상의 예외를 호출한 곳으로 전달 (처리 위임)

    • 예외가 없어지는 것이 아니라 단순히 전달됨
    • 예외를 전달 받은 메서드는 다시 예외 처리의 책임 발생
    • 처리하려는 예외의 조상 타입으로 throws 처리 가능

non runtime exception 과 throws

  • non runtime exception은 반드시 try~catch 또는 throws 필요
  • 필요한 곳에서 try~catch 처리

runtime exception과 throws

  • runtime exception은 throws 하지 않아도 전달되지만
  • 하지만 결국은 try~catch 로 처리해야 함
  • runtime exception은 예외 처리 X ⇒ Logic적 처리
    • 절대 error가 발생하지 않도록 프로그래밍 해야 함

메서드 재정의와 throws

  • 메서드 재정의 시 조상 클래스 메서드가 던지는 예외보다 부모 예외를 던질 수 없다.
    • 부모가 치지 않은 사고를 자식이 칠 수 없다.
  • Exception class도 결국에는 상속 관계에 있으므로 상속과 같이 자식 클래스가 부모 클래스에 담기는 것은 가능하나 반대의 경우는 불가능 하다.
    • Unreachable catch block Compile 에러 발생
  • 예외 변환
    • 하위 계층에서 발생한 예외는 상위 계층에 맞는 예외로 바꿔서 던져야 한다.
    • Exception Chaining
      • 하위 계층에서 발생한 예외 정보가 상위 계층의 예외를 디버깅 하는데 유용할 경우 사용
        • 하위 계층의 예외를 원인으로 상위 계층에서 예외를 발생
profile
같이 공부합시다~

0개의 댓글