[자바] 4화 예외처리(try,catch,finally / throws)
예외란?
프로그램이 처리하기에 문제가 생기는 것. 그러니까 프로그래머가 생각한대로 작동할 수 없는 상황을 예외라고 생각하시면 됩니다. 예외에 대한 예를 들어보자면, 파일을 읽도록 했는데 파일이 없거나 100번째 배열에 값을 저장하려 하는데 배열이 99번째가 마지막일 경우가 예외라고 할 수 있습니다.
예외를 들어보니 예외처리에 대한 감이 잡힙니다. 예외처리는 예외가 발생할 경우 프로그램이 할 일을 말하는 것입니다.
예외처리가 갖는 의미는 자바를 잘 쓸수록 커집니다. 사용자가 쓰기 쉬운 클래스이름으로 만들어서 접근이 용이합니다. 간단한 예로 C에서 파일의 끝을 while(feof(fp) != NULL)로 알아냈습니다. 하지만 자바에서는 EOFException이라는 예외처리 클래스를 사용하여 보다 직관적으로 소스코드를 읽어낼 수 있도록 도와줍니다.
자바에서 예외처리는 다음과 같은 형식으로 사용합니다.
try { //실행시킬 코드 } catch (Exception e) { //try에서 예외가 발생하면 실행된다. }
'먼저 try에서 실행할 명령을 적어주고 실행하다가 예외가 발생한 부분은 catch에 있는 실행코드를 따른다.'
finally를 때때로 쓰기도 합니다. finally까지 쓴다면 소스코드가 조금 길어집니다.
try { //실행시킬 코드 } catch(Exception e) { //try에서 예외가 발생하면 실행된다. } finally { //반드시 실행될 코드 }
finally 안에 있는 것들은 반드시 실행된다는 것만 알면 됩니다. finally 사용은 5화에서 예외발생 때 같이 하겠습니다.
예외처리에 대해 충분히 알았다면, 예외의 종류는 무엇이 있는지 알아보도록 하겠습니다.
예외처리의 종류는 대략 아래 그림과 같습니다.
(위의 예외처리 목록 안에 있는 것들만 있는 것은 아닙니다. 너무 많기 때문에 알고 있는 것과 책을 참고한 것들만 적었습니다.)
그림을 보면 알 수 있듯이, 예외처리는 extends를 사용하여 만들어졌습니다. 즉, Exception을 사용하면 어떤 예외가 발생하는가에 상관없이 예외가 발생하면 catch문으로 넘깁니다. 자세한 예외처리를 하려면 Exception 아래의 서브클래스들을 쓰는 것이 좋을 것 같습니다.
try와 catch를 이용하여 예외처리를 할 수 있지만 throws를 사용하여 예외처리를 할 수도 있습니다.
public class Rfile { public static void main(String[] args) throws FileNotFoundException { File file = new File("res/tet.txt"); Scanner input = new Scanner(file); System.out.println(input.nextLine()); input.close(); } }
throws 대신에 try/catch를 사용하면 아래와 같습니다.
public class Rfile { public static void main(String[] args) { File file = new File("res/tet.txt"); Scanner input; try { input = new Scanner(file); System.out.println(input.nextLine()); } catch (FileNotFoundException e) { } } }
throws를 사용한 것과 try/catch를 사용한 것의 차이는 무엇일까.
일단 throws는 클래스에 선언하였으므로 예외처리하는 범위가 try/catch보다 넓음을 알 수 있다. 또한 throws의 경우 해당 Exception이 알아서 예외처리를 진행합니다. (위의 경우 FileNotFoundException이 스스로 처리.)
하지만 try/catch를 사용하여 만들면 Exception이 발생할 경우 내가 어떻게 할 것인가에 대해 작성할 수 있습니다.
CheckedException / UncheckedException
예외처리를 하다보면 반드시 예외처리를 해야만 코드가 실행되는 경우가 있고 예외처리를 하지 않아도 상관없이 실행되는 코드가 있습니다. 예외처리를 반드시 해야 하는 경우를 CheckedException이라고 합니다. IOException이 대표적이며 컴파일러 단계에서 Exception이 발생하고 이 예외가 발생한 경우는 논리적인 오류가 아닙니다. 반면에 UncheckedException은 예외처리를 반드시 하지 않아도 실행됩니다. IndexOutOfBoundException이 대표적이며 프로그램이 실행될 때 Exception이 발생합니다. 이 예외가 발생한 경우는 대부분 사용자가 정수만 받을 수 있는데 문자를 넣었다던가 프로그래머가 없는 배열에 값을 넣도록 하는 등의 논리적인 문제입니다. (결론은 프로그래머의 짧은 생각 때문에 만들어지는 Exception.)
|
CheckedException |
UncheckedException |
필수성 |
O |
X |
체크 단계 |
컴파일러 |
프로그램 실행 시 |
예외 형태 |
명확 |
논리적 |
예 |
IOException … |
ArithmeticException IndexOutOfBoundException… |