본문 바로가기

JAVA/Syntax

예외처리 (Throwable) : Unchecked Exception과 Checked Exception

1. 예외란? (Error vs Exception)

먼저 오류(Error)와 예외(Exception)의 개념을 정리하고 넘어가자.

오류(Error)는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다. 따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.

오류가 시스템 레벨에서 발생한다면, 예외(Exception)는 개발자가 구현한 로직에서 발생한다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있다. 즉, 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.


오류 
Error : 프로그램이 정상적으로 실행되지 못하는 상황 (H/W) <Syntax, 메모리와 관련된>
Exception : 처리가능한 오류(처리하면, 정상화시킬 수 있다.)


   




2. Checked Exception 과 Unchecked Exception

Unchecked Exception

먼저, RuntimeException을 살펴보자. 

RuntimeException은 다시말하면, Unchecked Exception이라고 말할 수 있는데, 발생할 것 같은 예외를 체크해주지 않아서 

(즉, 프로그래머의 실수로인해서) 발생하는 실수이기 때문이다.

  => Code를 잘못 만들어서 생기는 문제. 

=> 업무의 흐름보다는 core(기본)적인 부분의 에러. 

//기본이 안되있는 코드. 

=> 컴파일 하는데는 문제가 없다. 실행하면 문제가 발생함. 


Checked Exception

Checked Exception은 

Exception처리코드 여부를 compiler가 check

 - 없으면 컴파일 에러!!

=> 프로그램 실행 흐름상 예외 발생 가능성있는 상황을 표현.(로직상 나올 수 있는 상황)

=> Code상의 문제가 아니라, 실행상황에 따라 발생가능성 있는 예외.

=> 프로그램 구현 흐름상 발생할 수 있는 예외.



   checked 계열 최상위 Exception : Exception
unchecked 계열 최상위 Exception  : RuntimeException

======================================
CHECKED 계열 ? UNCHECKED 계열?

예외는? 프로그램이 정상적으로 처리되지 않을 떄, 정상처리 시켜주는 것

 

RuntimeException클래스들은 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들로서 자바의 프로그래밍 요소들과 관계가 깊다. 
예를 들면, 배열의 범위를 벗어난다던가(IndexOutOfBoundsException)
값이 null인 참조변수의 멤버를 호출하려 했다던가(NullPointerException)
 클래스간의 형변환을 잘못했다던가(ClassCastException)
 정수를 0으로 나누려 했다던가(ArithmeticException)하는 경우에 발생하는 예외들이다. 

RuntimeException클래스들 중의 하나인 ArithmeticException을 try-catch문으로 처리하는 경우도 있지만, 
사실 try-catch문을 사용하기보다는 0으로 나누지 않도록 프로그램을 변경하는 것이 올바른 처리방법이다. 
이처럼 RuntimeException예외들이 발생할 가능성이 있는 코드들은 try-catch문을 사용하기 보다는 프로그래머들이 보다 주의 깊게 작성하여 예외가 발생하지 않도록 해야 할 것이다. 

그 외의 Exception클래스들은 주로 외부의 영향으로 발생할 수 있는 것들로서, 프로그램의 사용자들의 동작에 의해서 발생하는 경우가 많다. 예를 들면, 존재하지 않는 파일을 처리하려한다던지(FileNotFoundException), 실수로 클래스의 이름을 잘못 적었다던가(ClassNotFoundException), 입력한 데이터의 형식이 잘못되었다던가(DataFormatException) 하는 경우에 발생하는 예외들이다. 
이런 종류의 예외들은 반드시 처리를 해주어야 한다. 


RuntimeException클래스들 - 프로그래머의 실수로 발생하는 예외 
그 외의 클래스들 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 

RuntimeException클래스들 그룹에 속하는 예외가 발생할 가능성이 있는 코드에는 예외처리를 해주지 않아도 컴파일 시에 문제가 되지 않지만, 그 외의 Exception클래스들 그룹에 속하는 예외가 발생할 가능성이 있는 예외는 반드시 처리를 해주어야 하며, 그렇지 않으면 컴파일시에 에러가 발생한다. 


3. try-catch -finally & throws & throw


try catch finally   - 직접처리
1. 다음메소드에 던져줄 때, 명시해줘야한다. 나는 처리를 안하고 던져줄거다. 
        

throws        - 간접처리
2. 이걸 명시해주지않으면, 예외가 있는지 없는지 모르니까 명시해 준다.


throw         - 예외생성  
Checked Exception에서 던져주는것 상위 메소드에다가 예외를 만들어서.



*왠만하면 Catch구문 안에는 Logic를 넣지 않는다. (보통 log만찍는다.)
*Catch구문은 많이 쓸수 있다.
(권장)Catch계층구조가 높을수록 아래로 내려야 한다.  - 자식이 처리할수 있는 건 자식이 하고 자식이 처리하지 못하는 것은 아래에 둔다.(부모가 처리)
*순서가 바뀌면 UnReachableException이 발생한다.


예외처리 UnChecked Exception

 
		public void unCheckedException() {
		String str=null;
		try {
			System.out.println("프로그램 시작");
			str = str.concat("abc");
			System.out.println(str);
			int k = 10 / 0;
			System.out.println(k);
		} finally {
			System.out.println("프로그램 종료");
		}
	}

ㄴ메인함수

 
	public static void main(String[] args) throws Exception{

		UnCheckedException uce = new UnCheckedException();
		try{
		uce.unCheckedException();
		}
		catch(ArithmeticException | NullPointerException e){
			System.err.println(e);
		}
	}


예외처리 Checked Exception

 
public void copyFile(String srcFile, String targetFile) throws IOException {
		BufferedReader reader = null;
		PrintWriter writer = null;
		try {
			reader = new BufferedReader(new FileReader(srcFile));
			writer = new PrintWriter(targetFile);		
			String data=null;
			int line=1;
			while((data = reader.readLine())!=null){
				if(data.isEmpty())
					continue;
				writer.println(line+"\t"+data);
				line ++;
			}
		} finally {
			if (reader != null) reader.close();
			if (writer != null) writer.close();
		}
	}


※예외처리를 다룰 때는, Transaction 문제의 roll-back 문제를 같이 다루어야 한다.

아.... 엄청 빡시네....http://egloos.zum.com/tit99hds/v/1034143


예외처리를 할 때는 프로그램 내부적인 처리를 하는 것이 아니라 
프로그램에서 발생한 예외를 사용자가 직접 처리할 수 있는 곳에서 처리할 수있게 던져줘야 한다!


반응형

'JAVA > Syntax' 카테고리의 다른 글

Network 프로그래밍  (0) 2015.02.23
I/O 입출력 클래스 살펴보기  (0) 2015.02.12
[java.util] Collection과 Map을 이용한 정렬하기(Sort)  (0) 2015.02.09
제네릭스(Generics)  (0) 2015.02.09
가변인수 (String... args) JDK1.5  (0) 2015.02.06