본문 바로가기
Challenge

9주차 과제: 예외 처리

by Daisy :) 2021. 1. 15.
반응형

예외처리(exception handling)란?

프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것 이며, 예외처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상종료를 막고 정상적인 실행상태를 유지할 수 있도록 하는 것 입니다.

자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

1. try-catch문

try {
	// 예외가 발생할 가능성이 있는 문장을 넣습니다.
} catch (Exception1 e1){
	// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적습니다.
} catch (Exception2 e2){
	// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적습니다.
} catch (ExceptionN eN){
	// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적습니다.
}

→ 하나의 try블럭에 여러종류의 예외를 처리할 수 있고, 하나 이상의 catch 블럭이 올 수 있으며, 이 중 발생한 예외의 종류와 일치하는 단 한개의 catch블럭만 수행됩니다.

→ 발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않습니다.

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

   1. 발생한 예외와 일치하는 catch블럭이 있는 지 확인합니다.

   2. 일치하는 catch블럭을 찾게 되면 그 catch블럭 내의 문장들을 수행하고, 전체 try-catch문을 빠져나가서

      그 다음 문장을 계속해서 수행합니다. 

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

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

 

2. 멀티 catch블럭

→ JDK1.7부터 여러 catch블럭을 '|'기호를 이용해서, 하나의 catch블럭으로 합칠 수 있게 되었으며 이를 '멀티 catch블럭'이라고 합니다.

→ '멀티 catch블럭'을 이용하면 중복된 코드를 줄일 수 있으며, '|'로 연결할 수 있는 예외클래스의 개수 제한은 없습니다.

→ 멀티 catch블럭의 '|' 기호로 연결된 예외 클래스가 조상과 자손의 관계에 있다면 컴파일에러가 발생합니다.

try {
	...
} catch (ExceptionA e) {
	e.printStackTrace();
} catch (ExceptionB e2) {
	e2.printStackTrace();
}

                                                                            ▼

try {
	...
} catch (ExceptionA | ExceptionB e) {
	e.printStackTrace();
}

3. throw와 throws

→ throw는 Exception을 발생시킬 때 사용하는 키워드입니다.

    만약 어떤 연산을 하다가 예상치 못한 일이 발생했을 때 Exception을 발생시켜 예외가 처리될 수 있도록 합니다.            Application이 예외를 적절히 처리하지 못하면 프로그램이 죽거나 오동작하게 됩니다.

Throws는 메소드에서 잠재적으로 어떤 Exception이 발생할 수 있는지 명시하는 키워드입니다.

    throws는 메소드를 정의할 때 사용하며, 이 메소드에서 발생할 수 있는 Exception을 명시적으로 정의할 때 사용합니      다. 따라서 throws를 보면 잠재적으로 어떤 Exception을 발생될 수 있는지 쉽게 알 수 있습니다.

 

4. finally블럭

→ finally블럭은 예외의 발생여부에 상관없이 실행되어야 할 코드를 포함시킬 목적으로 사용됩니다.

→ try - catch 문의 끝에 선택적으로 덧붙여 사용할 수 있으며, try-catch-finally의 순서로 구성되고, 실행된다.

→ try블럭 안에 return문이 있어서 try블럭을 벗어나갈 때도 finally블럭이 실행됩니다.

try {
	// 예외가 발생할 가능성이 있는 문장들을 넣습니다
} catch (Exception1 e1){
	// 예외처리를 위한 문장을 적습니다.
} finally {
	// 예외의 발생여부에 관계없이 항상 수행되어야하는 문장들을 넣습니다.
	// finally블럭은 try-catch문의 맨 마지막에 위치해야 합니다.
}

자바가 제공하는 예외 계층 구조

ArithmeticException : 산술 연산에서 정수를 0으로 나누는 등 연산을 수행할 수 없는 경우

NullPointerException : null 객체의 인스턴스 메소드를 호출하는 등의 경우

ArrayIndexOutOfBoundsException : 배열에 잘못된 인덱스를 사용하여 접근할 경우

ClassCastException : 수행할 수 없는 타입 변환이 진행될 경우

Exception과 Error의 차이는?

* 실행 시 (runtime) 발생할 수 있는 프로그램 오류를 '에러(error)'와 '예외(exception)' 두가지로 구분이 됩니다.

에러(error) 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

에러는 메모리부족(OutOfMemoryError)이나 스탤오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류이고, 예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 것 입니다.

 

RuntimeException과 RE가 아닌 것의 차이는?

RuntimeException 프로그래머(사용자)의 실수로 발생하는 예외
Exception 사용자의 실수와 같은 외직인 요인에 의해 발생하는 예외

RuntimeException은 주로 프로그래머의 실수로 발생하는 예외들로 자바의 프로그래밍 요소들과 관계가 깊습니다.

위의 코드는 Exception 클래스는 extends하게 됩니다. 그 경우 메인 클래스에서 예외처리를 하지 않으면 에러가 발생됩니다. 

throw를 통해서 에러를 컴파일러에 전달을 해도 throws가 없으면 에러가 발생됩니다. 

만일 , 아래와 같이 EmptyException 클래스를 extends RuntimeException 했을 경우에는 메인클래스에서 예외처리를 하지않아도 에러가 발생되지않습니다. 

그 이유는 RuntimeException은 컴파일러가 처리하지않고 실행중에 발생하도록 되어있기 때문입니다.

 

RuntimeException의 종류

ArithmeticException 제로제산 등의 산술 예외 발생시
ArrayStoreException 배열에 부정한 형태의 오브젝트를 저장하고자 할때
IllegalThreadStateException 쓰레드가 요구된 처리를 하기에 적합한 상태에 있지 않을때
NumberFormatException 부적절한 문자열을 수치로 변환하고자 할때
IllegalMonitorStateException 모니터 상태가 부정일때
IllegalStateException 메소드가 요구된 처리를 하기에 적합한 상태에 있지 않을때
ArrayIndexOutOfBoundsException 범위 밖의 배열 첨자 지정시
StringIndexOutOfBoundsException 범위 밖의 String 첨자 지정시
NegativeArraySizeException 음의 크기로 배열 크기를 지정하였을때
NullPointerException null 오브젝트로 접근했을때
SecurityException 보안 위반시
UnsupportedOperationException 지원되지 않는 메소드를 호출했을때

커스텀한 예외 만드는 방법

문자열이 비어있을 때 Exception처리를 하는 코드를 작성해보았습니다.

public class EmptyException extends Exception {
	EmptyException(){
		this("비어 있어요.");
	}
	
	EmptyException(String msg){
		super(msg);
	}

}

그리고 그 Exception을 발생시키기 위한 메인클래스를 만들어보았습니다.

public class ExceptionMain {

	public static void main(String[] args) throws EmptyException {
		
		//throw new EmptyException(); //비어있어요 출력
		//throw new EmptyException("11111"); //11111 출력
		
		String message = null; // ""
		
		if( message == null || message.isEmpty() ) {
			throw new EmptyException("빈 문자에요. : " + message);
		}
	}
}

 

message가 null일 경우, 즉 위의 코드를 실행해보면 Console에는 아래와 같은 에러 메세지가 생성됩니다.

 

 

 

 

 

 

 

 

<reference>

자바의 정석 저자 남궁 성

codechacha.com/ko/java-throw-and-throws/

www.ezbocis.com/java-exception-jongryu/

반응형

'Challenge' 카테고리의 다른 글

11주차 과제: Enum  (0) 2021.01.29
10주차 과제: 멀티쓰레드 프로그래밍  (0) 2021.01.23
8주자 과제: 인터페이스  (0) 2021.01.08
7주차 과제: 패키지  (0) 2021.01.02
6주차 과제: 상속  (0) 2020.12.26

댓글