개주 훈련일지/📚 코살대 교본 학습

예외 처리

lshfood2 2025. 12. 2. 11:05

프로그램을 실행하다 보면

예기치 못한 오류가 발생한다.

 

자바는 에러 또는 예외가 발생할 경우

해당 사항을 클래스로 관리한다.

 

컴파일 또는 실행 중에 문제가 발생하면

해당 문제에 따른 클래스 객체를 생성하고

이 클래스를 이용해 예외들을 처리할 수 있다.

 

[ 에러와 예외 ] 

- 에러(error)

에러는 시스템에 비정상적인

상황이 생겼을 때 발생한다.

 

외부 요인일 수도 있고,

프로그램 구동 중에 발생하는

치명적인 오류일 수도 있다.

 

에러의 종류는 아래와 같다.

  • OutOfMemoryError
    프로그램 실행 중 메모리 부족
  • IOError
    입출력 에러
  • StackOverFlowError
    가용 메모리 부족 현상,
    재귀 호출 문제 시 발생

- 예외 (exception)

예외란 대체로 프로그램 구동 중에

나타나는 오류들을 말한다.

 

문법적으로는 문제없어 보이지만

실제 운영은 불가한 문제들이다.

 

예외는 '체크 예외'와 '비체크 예외' 두 가지가 있는데

보통 개발자는 비체크 예외 때문에 고난을 겪는다.

구분 체크 예외 비체크 예외
처리 여부 문법적으로 예외 처리를 강제함
반드시 처리 해야 함
문법적으로 강제하지 않음
개발자의 판단에 의해 처리
확인 시점 컴파일 단계 실행 단계
예외 클래스 Runtime Exception을 제외한 모든 예외,
IOException
SQLException 등
Runtime Exception의 자식 클래스 모두 포함,
NullPointException
IndexOutOfBoundException
ClassNotFoundException 등

[ 예외 클래스 ]

프로그램에서 발생하는 예외들은

클래스 형태로 제공된다.

 

아래 관계도를 통해 알아보자.

예외 클래스의 구조

 

최상위 Throwalbe을 상속받은 '에러'와 '예외'가 있다.

에러는 시스템상의 심각한 수준의 오류이므로

수습될 수 없는 반면, 예외는 개발자가

로직을 추가하여 처리할 수 있다.

 

표기된 예외 클래스 중 자주 사용되는 예외를 알아보자.

 

1. NullPointException

가장 빈번하게 발생하며, 객체가 제대로

생성되지 않은 상태에서 사용할 경우 발생한다.

예시 상황 )
객체는 정의했는데
실제 메모리에 생성(할당)되지 않았을 경우,
객체에 값을 담아주지 않은 경우 등...

 

2. NumberFormatException

잘못된 문자열을 숫자로 형 변환할 때 발생한다.

예시 상황 )
숫자 형태 '111'의 문자열 타입은
int 정수 타입으로 변환할 수 있으나,
문자가 포함되거나 실수 형태인 '11.11'의
문자열은 int 타입으로 변환할 수 없다.

 

3. ArrayIndexOutOfBoundsException

배열에서 인덱스 범위를 초과해 사용할 때 발생한다.

예시 상황 )
int[] arr = {1,3,5};
System.out.println(arr[4]);

배열의 인덱스는 3밖에 없는데
4를 불러오게 되면?
> 범위를 초과해 오류가 발생한다.

[ 예외 처리 문법 ] 

예외가 발생했을 때 어떻게 처리해야하는지

예외 처리 문법을 통해 알아보자.

 

1. 자바의 예외 처리 과정

  1. 코드 진행 중 예외 발생 시 JVM 알림
  2. JVM은 발생한 예외를 분석 후
    알맞은 예외 클래스에게 전송
  3. 생성된 예외 객체를 발생한 지점으로 보냄
  4. 예외가 발생한 지점에서 처리하지 않으면
    프로그램 비정상 종료

위와 같이 예외가 발생했을 때

이를 처리하지 않으면 프로그램이

비정상으로 종료되는 것을 알 수 있다.

 

그래서 우리는 넘어온 예외를 처리해

프로그램이 끝까지 구동될 수 있게 해야한다.

 

2. try-catch 구문

예외를 처리하는 가장 기본 문법으로

기본 구조는 아래와 같다.

try{
//예외가 발생할 가능성이 있는 코드

} catch(예외클래스명 e){//Exception e 추천
//예외 처리 코드
}

코드 진행

↓ 오류 발생

JVM 예외 객체 발생

↓ 캐치 확인

캐치문 실행

 

예외가 발생할 가능성이 있는 코드는

try{ } 안에 작성하고, catch 메서드는

시스템으로부터 넘어오는 예외 클래스를

받아서 처리하는 역할이다.

 

예외 클래스명 e 자리에는 예외 클래스의

최상위 객체 Exception을 이용하면

모든 예외 처리가 가능하다.

 

3. 다중 catch

try 구문 안에서 다양한 예외가 발생할 경우

다중 catch문을 사용하면 발생한 예외별로

예외 처리 코드를 다르게 하여 처리가 가능해진다.

try{
//예외가 발생할 가능성이 있는 코드
//1. 널포인트 익셉션 발생
//2. 인풋미스매치 익셉션도 발생

} catch(NullPointException e){
//예외 처리 코드 1
} catch(InputMismatchException e){
//예외 처리 코드 2
}

이렇게 로직을 구성하면

1. 널포인트 오류일 때 대응하는 안내문과

2. 잘못입력한 오류일 때 대응하는 안내문

 

이렇게 2종류의 오류 안내가 가능하다.

> 1의 경우 : 카드를 선택해주세요.

> 2의 경우 : 카드 번호를 잘못 입력하였습니다.

 

4. finally

finally 블록은 예외 발생 유무와 상관없이

실행되는 구문이며 생략할 수 있다.

 

예외와 상관없이 반드시 처리해야 하는

기능들을 작성할 때 사용하며

보통 외부 연동이나 예외가 발생해도

정상 종료되어야 할 기능들에서 사용한다.

try{
//실행 코드(예외 발생 가능성 있음)
} catch(예외클래스명 e){//Exception e 추천
//예외 처리 코드

} finally {
//반드시 처리해야하는 코드
}

주로 기능을 실행하기 위해 켜진 유틸 프로그램 혹은

메인 프로그램이 정상 종료되도록 강제종료 시키는데 사용한다.


[ 예외 던지기 ]

메서드 내부 말고 해당 메서드를 호출하는 곳에서

직접 예외처리를 진행할 수 있게 던질 수도 있다.

이것을 '예외 던지기' 또는 '예외의 전가' 라고 한다.

 

throws 키워드를 통해 사용할 수 있다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
//throws를 통한 예외 던지기 실행
throws ServletException, IOException {
	doAction(request, response);
}

위와 같이 서블릿 코드에서 주로 확인할 수 있는데

오류 발생 시 ServletException, IOException 객체에서

오류 처리를 진행하게 된다.

 

예외 객체는 여러 개를 던질 수 있으며,

여러 개를 던질 시에는 콤마(,)로 구분해서 나열한다.


[ 사용자 정의 예외 처리 ]

자바가 제공하는 예외 객체 말고도

개발자의 목적에 의해

나만의 예외 객체를 만들 수 있다.

 

자바가 제공하는 예외 객체로

모든 예외가 처리되지 않기 때문에

개발자가 필요에 따라,

직접 예외를 생성하여 처리하는데

 

사용자가 만든 클래스에 Exception 또는

RuntimeException을 상속하면 해당 클래스를

예외 처리 객체로 사용할 수 있게 된다.

  • 체크 예외 시 Exception 사용
  • 비체크 예외 시 RuntimeException 사용 
public class MyErrorException extends Exception{
//체크 예외 시
...
}
public class MyErrorException extends RuntimeException{
//비체크 예외 시
...
}

'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글

자바 API 문서  (0) 2025.12.03
프로젝트 계획과 스케줄링  (0) 2025.12.02
내부 클래스와 종류  (0) 2025.12.01
프로젝트 계획과 관리  (0) 2025.12.01
소프트웨어 개발 방법론  (0) 2025.12.01