잡다

예외처리(Exception)에 대하여. 본문

개발/DB

예외처리(Exception)에 대하여.

크로우 2020. 12. 24. 16:00

07-4 예외처리 (Exception)

 

프로그램을 만들다 보면 수없이 많은 에러가 난다. 물론 에러가 나는 이유는 프로그램이 오동작을 하지 않기 하기 위한 자바의 배려이다. 하지만 때로는 이러한 에러를 무시하고 싶을 때도 있고, 에러가 날 때 그에 맞는 적절한 처리를 하고 싶을 때도 있다. 이에 자바는 try ... catch, throw등을 이용하여 에러를 처리 할 수 있도록 도와준다.

예외를 처리하는 방법에 대해서 알게 되면 보다 안전하고 유연한 프로그래밍을 구사 할 수 있을 것이다.

 

예외는 언제 발생하는가?

에러를 처리하는 방법을 알기 전에 어떤 상황에서 에러가 나는지 한번 보자. 오타를 쳤을 때 나는 구문 에러 같은 것이 아닌 실제 프로그램에서 잘 발생하는 에러를 보기로 하자. 먼저 없는 파일을 열려고 시도해 보자.

 

BufferedReader br = new BufferedReader(new FileReader("나없는파일"));
br.readLine();
br.close();
Exception in thread "main" java.io.FileNotFoundException: 나없는파일 (지정된 파일을 찾을 수 없습니다)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileReader.<init>(Unknown Source)
    ...

 

위의 예에서 보듯이 없는 파일을 열려고 시도하면 FileNotFoundException라는 이름의 예외가 발생하게 된다.

이번에는 또 하나 자주 발생하는 에러로 0으로 어떤 다른 숫자를 나누는 경우를 생각해 보자.

 

int c = 4 / 0;
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Test.main(Test.java:14)

a는 {1, 2, 3}이란 배열인데 a[3]은 a 배열에서 구할 수 없는 값이기 때문에 ArrayIndexOutOfBoundsException가 나게 된다. 자바는 이런 예외가 발생하면 프로그램을 중단하고 에러메시지를 보여준다.

 

예외 처리하기

자, 이제 유연한 프로그래밍을 위한 예외처리의 기법에 대해서 살펴보자. 다음은 예외처리를 위한 try, catch문의 기본 구조이다.

 

try {
    ...
} catch(예외1) {
    ...
} catch(예외2) {
    ...
...
}

 

try문안의 수행할 문장들에서 예외가 발생하지 않는다면 catch문 다음의 문장들은 수행이 되지 않는다. 하지만 try문안의 문장들을 수행 중 해당예외가 발생하면 예외에 해당되는 catch문이 수행된다.

숫자를 0으로 나누었을 때 발생하는 예외를 처리하려면 다음과 같이 할 수 있다.

 

int c;
try {
    c = 4 / 0;
}catch(ArithmeticException e) {
    c = -1;
}

ArithmeticException 이 발생하면 c에 -1을 대입하도록 예외처리한 것이다.

 

 

finally

프로그램 수행 도중 예외가 발생하면 프로그램이 중지되거나 예외처리를 했을 경우 catch구문이 실행된다. 하지만 어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야 한다면 어떻게 해야 할까?

다음의 예제를 보도록 하자.

 

public class Test {
    public void shouldBeRun() {
        System.out.println("ok thanks.");
    }

    public static void main(String[] args) {
        Test test = new Test();
        int c;
        try {
            c = 4 / 0;
            test.shouldBeRun();
        } catch (ArithmeticException e) {
            c = -1;
        }
    }
}

 

위 예를 보면 test.shouldBeRun() 이라는 메소드는 절대로 실행될 수 없을 것이다. 4/0에 의해서 ArithmeticException이 발생하여 catch구문으로 넘어가기 때문이다. (여기서는 오류가 발생함을 명시적으로 나타내기 위해 4/0 이라는 억지코드를 삽입한 것이다.)

shouldBeRun() 메소드는 이름에서 알 수 있듯이 반드시 실행되어야 하는 메소드라고 가정해 보자.

이런 경우를 처리하기 위해 자바는 finally라는 구문을 제공한다. 다음과 같은 예를 보도록 하자.

 

public class Test {
    public void shouldBeRun() {
        System.out.println("ok thanks.");
    }

    public static void main(String[] args) {
        Test test = new Test();
        int c;
        try {
            c = 4 / 0;
        } catch (ArithmeticException e) {
            c = -1;
        } finally {
            test.shouldBeRun();
        }
    }
}

finally 구문은 try문장 수행 중 예외발생 여부에 상관없이 무조건 실행된다. 따라서 위 코드를 실행하면 test.shouldBeRun() 메소드가 수행되어 "ok, thanks"라는 문장이 출력될 것이다.

 

 

 

 

 

 

 

 

출처:https://wikidocs.net/229

'개발 > DB' 카테고리의 다른 글

SqlSessionTemplate, MapperInterface 개념/빈 등록 설정  (0) 2021.12.19
Comments