자바 - 예외처리

KH·2023년 3월 24일

Java

목록 보기
5/11

프로그램 오류

  • 발생 시점에 따라 컴파일 에러와 런타임 에러로 나눌 수 있다.
  • 컴파일 할 때 발생하는 에러: 컴파일 에러
  • 프로그램의 실행도중 발생하는 에러: 런타임 에러
  • 실행은 되지만, 의도와 다르게 동작하는 것: 논리적 에러
  • 런타임 에러를 에러와 예외 두 가지로 구분한다.
  • 에러는 메모리 부족이나 스택오버플로우와 같이 발생하면 복구할 수 없는 심각한 오류
  • 예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 오류

예외 클래스의 계층구조

  • 모든 클래스의 조상은 Object 클래스이므로 Exception과 Error 클래스 역시 Object 클래스의 자손들이다.
  • 모든 예외의 최고 조상은 Exception 클래스이다.
  • 크게 RuntimeException과 나머지 Exception으로 나누겠다.
  • RuntimeException클래스들은 프로그래머 실수에 의해서 발생될 수 있는 예외이다.
    • 배열 범위 벗어나거나, null 값 호출 등
  • Exception은 주로 외부의 영향으로 발생할 수 있는 것, 사용자들의 동작에 의해 발생
    • 존재하지 않는 파일의 이름 입력, 입력된 데이터 형식오류 등

예외처리 - try -catch

  • 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드 작성
    • 프로그램의 비정상 종료를 막고, 정상상태 유지
try{ // 예외가 발생할 수 있는 코드 작성
}
catch(Exception e){ //Exception이 발생했을 때 처리 코드 작성 
}
  • try블럭 내에서 예외가 발생한 경우
    • 발생한 예외와 일치하는 catch 블럭이 있는지 확인
    • 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다.
    • 만약 일치하는 catch 블럭을 찾지 못하면 예외는 처리되지 못한다.
  • try 블럭 내에서 예외가 발생하지 않은 경우
    • catch 블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
여러 catch

try{}
catch(){}
catch(){}
catch(){}


멀티 catch 블럭
try{}
catch(ExceptionA | ExceptionB e){}
  • 멀티 catch 블럭에서 주의할 점
    • Exception이 조상과 자손의 관계가 있다면 에러가 발생한다.
    • 조상만 사용하면 된다.

예외 발생시키기

  • throw라는 키워드를 사용하여 프로그래머가 고의로 예외를 발생시킬 수 있다.
  1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다
    • Exception e = new Exception("고의 발생");
  2. throw를 이용해서 예외 발생
    • throw e;
  • 두 줄을 합쳐서 throw new Exception("고의 발생"); 으로 사용할 수 있다.

메서드에 예외 선언

  • 메서드의 선언부에 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 적어주면 된다.
  • 예외가 여러 개일 경우 쉼표로 구분
  • ex) void method() throws Exception1, Exception2 ... {}
  • 만약 Exception클래스를 선언하면 해당 메서드는 모든 종류의 예외가 발생할 수 있다는 의미이다.
  • 해당 방법은 예외를 처리하는 것이 아니라, 메서드를 호출한 메서드에게 예외를 전달하여 예외처리를 맡기는 것이다.

finally

  • 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용
  • try-catch문의 끝에 선택적으로 덧붙여 사용할 수 있다.

사용자 정의 예외 만들기

  • 기존에 정의된 예외 클래스를 상속받아 필요에 따라 새로운 예외 클래스를 정의하여 사용할 수 있다.

예외 되던지기(exception re-throwing)

  • 한 메서드에서 발생할 수 있는 예외가 여럿인 경우, 일부는 try catch문 일부는 호출한 메서드에서 처리하게 할 수 있다.

0개의 댓글