1. 예외란? (Error vs Exception)
먼저 오류(Error)와 예외(Exception)의 개념을 정리하고 넘어가자.
오류(Error)는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다. 따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.
오류가 시스템 레벨에서 발생한다면, 예외(Exception)는 개발자가 구현한 로직에서 발생한다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있다. 즉, 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.
2. Checked Exception 과 Unchecked Exception
Unchecked Exception
먼저, RuntimeException을 살펴보자. RuntimeException은 다시말하면, Unchecked Exception이라고 말할 수 있는데, 발생할 것 같은 예외를 체크해주지 않아서 (즉, 프로그래머의 실수로인해서) 발생하는 실수이기 때문이다. => Code를 잘못 만들어서 생기는 문제. => 업무의 흐름보다는 core(기본)적인 부분의 에러. //기본이 안되있는 코드. => 컴파일 하는데는 문제가 없다. 실행하면 문제가 발생함. |
Checked Exception
Checked Exception은 Exception처리코드 여부를 compiler가 check - 없으면 컴파일 에러!! => 프로그램 실행 흐름상 예외 발생 가능성있는 상황을 표현.(로직상 나올 수 있는 상황) => Code상의 문제가 아니라, 실행상황에 따라 발생가능성 있는 예외. => 프로그램 구현 흐름상 발생할 수 있는 예외. |
이처럼 RuntimeException예외들이 발생할 가능성이 있는 코드들은 try-catch문을 사용하기 보다는 프로그래머들이 보다 주의 깊게 작성하여 예외가 발생하지 않도록 해야 할 것이다.
이런 종류의 예외들은 반드시 처리를 해주어야 한다.
그 외의 클래스들 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
3. try-catch -finally & throws & throw
*왠만하면 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 |