bboks.net™

Java Exception 자바 예외처리 본문

Java/Java

Java Exception 자바 예외처리

bboks.net 2007. 7. 10. 14:22
예외란 무엇이며 또 에러와는 어떻게 다른가?

우리가 소스를 컴파일 하다보면 잘못된 문법이나 변수이름등의 식별자를 잘못씀으로써 컴파일타임에 에러가 발생할 수 있다. 이런 것들은 컴파일러가 다 잡아주기 때문에 문법을 잘 수정하면 된다. 그러나 컴파일시 발생하는 문법적 예외말고도 다양한 방법으로 프로그램의 실행을 방해할 수 있는 요소가 발생할 수 있을 것이다.


   예를 들어 실제 물리적인 파일을 다루기 위해 자바에서는 File클래스를 이용한다. 이때 아직 존재 하지 않는 파일도 File클래스의 객체로 만들어 쓸 수 있다. 왜냐 새로 파일을 만들 경우를 대비해서. 그러므로 File클래스의 생성자는 별다른 예외가 없다고 간주하여 예외에 대한 발생을 명시하지 않는다.


그러나 파일을 통해서 그 파일을 읽어드리거나 쓰고자 하는 상황은 약간 다르다. 아직 존재하지 않는 파일이야 만들면 되지만 만들어지지도 않은 파일로 부터 어떠한 내용을 읽어 오는 것은 불가능한 일이다. 따라서 FileInputStream(파일읽기)과 FileOutputStream(파일쓰기)클래스의 생성자는 프로그래머가 아직 존재하지 않는 파일을 두 클래스의 생성자의 파라미터로 쓰는 경우를 대비해서 FileNotFoundException예외를 발생한다고 명시해 놓았다.


이처럼 예외란 버그(프로그램이 우리가 원하는 방식으로 동작하지 않는: 프로그램 자체의 논리적인 오류)나 문법적 에러와는 또 다르게 컴파일시점과 실행시간에 프로그램의 흐름을 방해하는 모든 프로그램밍적 상황을 의미한다고 할 수 있다. 그래서 예외(Exception)라고 부르는 모양이다. 자바에서는 예외를 발생시키는 것을 '던진다(thorw)'고 표현하며 그 예외를 처리하는 것을 잡는다(try ~ catch)고 표현하여 예외가 발생되는 시점을 나누어 처리하도록 하고 있다.


자바 언어는 이러한 예외에 대해서도 언어차원에서 접근하게 하기 위하여 예외를 클래스로 나누었다. 예외의 최상위에는 Throwable이라는 클래스가 있으면 이것을 직접적으로 상속받는 Error와 Exception으로 나뉜다. 자바에서는 크게 잡을 수 있는(try~catch나 throws로 처리가능한) 예외와 잡을 수 없는 예외(처음부터 코드의 수정을 필요로 하는)로 구분하는데 잡을 수 없는 예외로는 Error 클래스의 자식들인 AWTError, LinkageError, ThreadDeath, VirtualMachineError와 Exception의 자식 클래스중 RuntimeException이 있다.    


RuntimeException에는 우리가 프로그램을 실행시간에 발생하는 예외로서 발생하면 사람 머리를 아프게 만드는 악덕한 넘들로써 ArithmeticException, ClassCastException, IllegalArgumentException, IllegalStateException, IndexOutOfBoundsException, Negative-ArraySizeException, NoSuchElementException, NullPointerException,SecurityException 등을 자주 볼수 있다.