Java - 예외(Exception)란?

컴퓨터/Java

728x90
반응형

예외(Exception)이란? - 예외 vs 오류

프로그램이 구동하고 있는 런타임 과정 중 생기는 런타임 오류를 2가지로 구분할 수 있습니다.

오류(Error)는 프로그램이 비 정상적으로 작동하여 복구가 될 수 없는 상황을 말합니다. 예를 들어 프로그램이 구동되는 중 하드웨어의 메모리가 부족한 경우 등의 에러가 대표적입니다.

하지만 예외(Exception)는 프로그램이 구동하는 중 예측 가능한 오류를 예외라고 말합니다. 예를 들어 숫자만 입력할 수 있는 정수형 변수에 문자열을 입력하는 경우 등을 말합니다.

이처럼 예외는 프로그램을 구동하면서 충분히 일어날 수 있고, 예측할 수 있는 오류를 Java에서는 예외라고 부릅니다. 

 

런타임 오류 클래스의 구조

런타임 오류는 앞에서 말한 것과 같이 오류와/예외로 구분합니다. 객체지향 언어인 Java에서는 상속관계로 클래스가 형성되어 있습니다.

 

그림처럼 Throwable클래스를 상속받는 예외와 오류 클래스는 앞서 말했듯이 차이를 가지고 있습니다.

  • Error클래스는 심각한 오류여서 프로그램의 로직적 변경이 필요하다. (프로그램 구동 불가)
  • Exception클래스는 예측가능한 오류로 적당한 문법적 처리가 필요하다 (프로그램 구동 가능)

그럼 예외에 존재하는 대표적인 2종류의 예외에 대해 알아보도록 하겠습니다.

 

Checked Exception vs Unchecked Exception

예외 클래스는2가지의 종류의 자식 클래스가 있습니다. 두 가지의 예외는 프로그래머가 예측할 수 있는 문법적 처리가 가능한 예외지만 반드시 처리를 해야 하는가 하지 말아야 하는가의 차이를 가지고 있습니다. 정리하자면 다음과 같습니다.

종류 Checked Exception Unchecked Exception
예외 처리 여부 필수 필수X
확인 시점 컴파일  런타임
대표 예외 클래스 IOException
SQLException
NullPointerException
BufferOverflowException
IndexOutOfBoundException

위의 표처럼 예외는 2가지의 종류로 발생합니다.

Checked Exception은 반듯이 처리해야 하는 예외이므로 해당 예외가 발생할 가능성이 있다면 개발자는 필수적으로 처리를 해야 됩니다. Uncheked Exception의 경우 필수적인 예외처리를 하지 않아도 프로그램은 구동합니다. 하지만 프로그램이 구동하는 과정에서 해당 예외 발생으로 인해 구동에 장애를 가지고 올 수 있습니다. 

결론적으로 개발자는 발생활 예외들을 인지하고 그 예외들이 발생하지 않게 하거나 발생했을 경우 처리를 해야 됩니다.

 

예외 처리의 방법

Java언어를 이용하여 프로그램을 만들다 보면 다양한 예외를 마주하게 됩니다. 이때 개발자들은 적절하게 예외를 처리할 수 있게 소스코드를 작성해야 됩니다. 작성하기 전 예외처리를 하는 대표적인 3가지 방법을 말하자면 다음과 같습니다.

  • 예외 복구 방법
    • 예외가 발생했을 때 다른 작업으로 흐름을 유도한다.
  • 예외처리 회피 방법
    • 예외가 발생했을 때 처리하지 않고 던져버린다(무시한다.)
  • 예외 전환
    • 예외가 발생했을 때 그 예외를 프로그래머가 인지한 예외로 바꾸어 처리한다.

예외 복구 방법 - try ~ catch문

try ~ catch 문법을 이용하여 특정 소스코드를 동작시켰을 때 예외가 발생됐을 경우의 흐름을 유도할 수 있다.

 

 

  • 기본 형식
try{
	//시도할 소스코드 구문
    //예외가 발생될 수도있는 구문들을 작성한다
    return; // 예외 없이 정상적인 동작을 했다면 해당 구문 종료
}
catch (Exception e){
	//예외가 발생했을 때 동작할 구문
}
  • 여러 예외에 따른 각각의 처리
try{
	//시도할 소스코드 구문
    //예외가 발생될 수도있는 구문들을 작성한다
    return; // 예외 없이 정상적인 동작을 했다면 해당 구문 종료
}
catch (NullPointerException e1){
	//NullPointerException 예외가 발생했을 때 동작할 구문
}
catch (IndexOutOfBoundException e2){
	//IndexOutOfBoundException 예외가 발생했을 때 동작할 구문
}
  • finally 구문을 통한 필수적으로 해야되는 구문 추가
try{
	//시도할 소스코드 구문
    //예외가 발생될 수도있는 구문들을 작성한다
    return; // 예외 없이 정상적인 동작을 했다면 해당 구문 종료
}
catch (NullPointerException e1){
	//NullPointerException 예외가 발생했을 때 동작할 구문
}
catch (IndexOutOfBoundException e2){
	//IndexOutOfBoundException 예외가 발생했을 때 동작할 구문
}
finally{
	//해당 예외처리 구문을 들어가서 마지막에 무조건 실행되야 될 구문 추가
}

예외 처리 회피 방법 - throws 

예외처리를 회피하는 방법은 throws 구문을 사용한다 다양한 IDE를 사용하여 java언어를 통해 데이터 베이스나 다른 외부 프로그램들과 연동할 때 이런 구문을 많이 볼 것이다.

puvlic void func() throws SQLException{
	//구현 로직
    //throws SQLException예외가 발생하면 해당 함수가 호출한 곳으로 예외를 던지겠다는 의미
}

 

 

728x90
반응형

'컴퓨터 > Java' 카테고리의 다른 글

Java - HashMap  (0) 2021.10.29
Java - ArrayList  (0) 2021.10.12
Java - import  (0) 2021.10.08
Java - 제네릭(Generic)  (0) 2021.10.06
Java - 컬렉션프레임워크(CKP)  (0) 2021.10.05

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :