Java의 정석_기초편

예외처리(exception handling)

DJDU 2022. 10. 24. 11:22

프로그램 오류의 종류 ⭐️

  1. 컴파일 에러(compile-time error) : 컴파일 시 발생하는 에러
  2. 런타임 에러(runtime error) : 실행 시 발생하는 에러(프로그램 종료)
  3. 논리적 에러(logical error) : 실행은 되지만, 작성 의도와 다르게 동작하는 것(프로그램 종료x)
더보기

1. 컴파일 에러(compile-time error) :컴파일 시 발생하는 에러

 

컴파일러 하는 일

  1. 구문 체크
  2. 번역
  3. 최적화
  4. 생략된 코드 추가

컴파일러가 하는 일은 기본적으로 '구문 체크 및 번역'이다. 문법에 맞아야 번역을 할 수 있기 때문에 '구문체크'를 먼저 한다. 그리고 소스코드 '최적화'기능도 한다. 옛날에는 구문체크, 번역만 했는데 요즘에는 컴파일러가 똑똑해져서 더 많은 에러를 체크할 수 있고, 최적화까지 한다. 

 간단한 계산의 경우, 컴파일러가 해준다. int i = 3 + 5; 이 정도 수준의 상수 끼리의 계산은 컴파일러가 해준다. 실행 시 또는 컴파일 시에 계산 결과가 똑같기 때문이다. 컴파일러가 계산 결과를 8로 바꿔준다.

 또한, '생략된 코드 추가'를 해준다. 예를 들어, extends Object와 같은 코드를 컴파일러가 자동으로 추가해준다.

 

IDE는 저장할 때마다 빌드 시 자동으로 컴파일해준다.(옵션 체크 시)
자바 컴파일러(javac.exe) - javac 명령어를 사용하여 자바 파일을 컴파일한다.

컴파일 했을 때, ExceptionTest.java의 5번째 줄에 에러가 발생했다.

 

2. 런타임 에러(runtime error) : 실행 시 발생하는 에러(프로그램 종료)

IDE에서 ExceptionTest.java 실행 결과
자바 인터프리터(java.exe) - java 명령어를 사용하여 자바 소스파일을 실행한다.

실행 결과, ExceptionTest.java의 5번째 줄에 ArrayIndexOutOfBoundsException에러가 발생했다.

 

3. 논리적 에러(logical error) : 실행은 되지만,작성 의도와 다르게 동작 하는 것(프로그램 종료x)

예를 들면, 미사일 게임, 미사일이 날라와서 맞았는데 비행기가 죽지 않는다. 아니면 재고 관리 프로그램에서 재고가 음수로 떨어지는 경우가 바로 논리적 에러의 한 예이다. 프로그램이 종료되지는 않지만 원치않게 동작한다.

 

예제ExceptionTest

 

런타임 에러 종류(Java) ⭐️

  • 1. 에러(error) : 프로그램 코드로 수습할 수 없는 심각한 오류
  • 2. 예외(exception) : 프로그램 코드로 수습할 수 있는 다소 미약한 오류
  • 에러(error)는 어쩔 수 없지만, 예외(exception)는 처리하자.

 

예외처리의 정의와 목적 ⭐️

  • 정의 : 프로그램 실행 시 발생할 수 있는 예외 발생에 대비한 코드를 작성하는 것
  • 목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

 

예외(Exception) 종류 ⭐️ 

  1. Exception클래스와 그 자손들
  2. RuntimeException클래스와 그 자손들
더보기

1. Exception클래스와 그 자손들

  • 사용자들의 실수와 같은 외적인 요인이 발생시키는 예외
  • checked예외 : 컴파일러가 예외 처리 여부를 체크
  • 예외 처리 & try-catch 필수
예외 클래스의 계층 구조

 

② RuntimeException클래스와 그 자손들

  • 프로그래머가 실수로 발생시키는 예외
  • unchecked예외 : 컴파일러가 예외 처리 여부를 체크 안 함(예외 처리 선택)
  • 예외 처리 & try-catch 선택
프로그램 오류 정리

 

예외 처리하기

더보기

예외 처리하기

try {
    // 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
	// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
	// Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception3 eN) {
	// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}
if문과 달리, try블럭이나 catch블럭 내에 포함된 문장이 하나뿐이어도 괄호{}를 생략할 수 없다.

 

try-catch문에서의 흐름

  1. try블럭 내에서 예외가 발생한 경우
  2. try블럭 내에서 예외가 발생하지 않은 경우
더보기

1. try블럭 내에서 예외가 발생한 경우

  1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
  2. 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고
    전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다.
    만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다. (프로그램 비정상 종료)
  3. Exception이 선언된 catch블럭은 모든 예외 처리 가능하다.
    Exception클래스는 모든 예외의 최고 조상이기 때문.
    가장 마지막에 위치해야 한다.

예제8-2

2. try블럭 내에서 예외가 발생하지 않은 경우

  1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.

예제8-1

 

예외의 발생과 catch블럭

  • 예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려감
  • 일치하는 catch블럭이 없으면, 예외는 처리 안 됨
  • Exception이 선언된 catch블럭은 모든 예외 처리(마지막 catch블럭)
더보기

예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려감

일치하는 catch블럭이 없으면, 예외는 처리 안 됨

Exception이 선언된 catch블럭은 모든 예외 처리(마지막 catch블럭)

 

예제8-4