자바 예외처리(Exception Handling)

 

예외처리


예외처리하기 : try - catch문

 

예제

public static void main(String[] args) {
    System.out.println(1);
    try {
        System.out.println(2);
        System.out.println(0/0);
        System.out.println(3); //실행 xXXX
    }
    catch (ArithmeticException ae) {
        if (ae instanceof ArithmeticException) {
            System.out.println(4);
        }
        System.out.println(5);
    }
    catch (Exception e) {
        System.out.println(6);  //실행 XXX 이미 catch구문이 앞에서 걸림
    }
    System.out.println(7);
}

try-catch문의 예제이다. 

   1.  1,2 는 출력되고 0/0에러 에러가 발생하여 3이실행되지않는다.

   2.  에러가 발생한 이유가 ArithmeticException이므로 catch(Ar~~ ae) {} 문으로 가게되고 instanceof가 true임으로 4,5가 출력된다.

   3. catch문은 하나만 실행됨으로 밑에있는 catch(Exception e){}는 실행되지 않는다.

   4. 7이 출력된다.

 

예외처리 정보얻기


printStackTrace() : 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메세지를 화면에 출력

getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.

예제

try {
    System.out.println(2);
    System.out.println(0 / 0);
    System.out.println(3); //실행 xXXX
} catch (ArithmeticException ae) {
    if (ae instanceof ArithmeticException) {
        System.out.println(4);
    }
    System.out.println(5);
    ae.printStackTrace();
    System.out.println(ae.getMessage());

print

1
2
4
5
/ by zero
java.lang.ArithmeticException: / by zero
	at chapter8.main(chapter8.java:6)

이처럼 에러메세지에 대한 정보를 얻을 수 있다.

 

예외발생시키기


1. Exception e=  new Exception("고의발생")   //객체만들기

2. throw e;

   try {
        Exception e = new Exception("고의발생");
        throw e;

    }
    catch (Exception e){
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}

 

단, 

throw new RuntimeException();

과 같이 RuntimeException의 경우에는 사용자 실수와 관련된 에러이기 때문에 예외처리를 하지 않아도 컴파일은 된다.

하지만 Exception과 그 자손들은 예외처리를 해주어야한다.

 

메서드에 예외 선언하기


사용법 : void method() throws Exception1,Exceoptib2 { }

public static void main(String[] args) throws Exception {
    method1();
}
    static void method1() throws Exception {
        method2();
    }
    static void method2() throws Exception{
        throw new Exception();
    }

다음을 보면

   1. method2()에서 throw new Exception으로 인해 강제적으로 예외가 발생하였으나 method2()에는 try -catch문이없음

   2. method2()를 호출한 method1()로 가서 try-catch문을 찾음

   3. method1()을 호출한 main으로가서 try-catch문을 찾음 -> 없음.  컴파일 에러.

 

 

finally 구문


finally는 예외 발생에 상관없이 무조건 수행됨 .   try-catch-finally

chapter8.method1();
    System.out.println("main끝");
}
static void method1() {
    try{
        System.out.println("method1");
        return; //메서드 종료
    }
    catch (Exception e){
        e.printStackTrace();
    }
    finally {
        System.out.println("finally구문");
    }
}

다음과 같이 try구문에 return이있어서 메서드를 종료해도 finally에있는것은 무조건 실행됨

결과

method1
finally구문
main끝

 

try-with-resources문 이라는 것도 존재한다.

 

사용자가 예외 만들기


사용자가 예외구문도 만들수있다. (요즘엔 RuntimeException을 상속받아서 사용한다.)

예제

public static void main(String[] args) throws Exception {
        try {
            startInstall();
            copyFiles();
        } catch (SpaceException e) {
            System.out.println(e.getMessage());
            System.out.println("공간확보 필요"
            );
        } catch (MemoryException me) {
            System.out.println(me.getMessage());
            System.out.println("다시 설치를 시도");
        } finally {
            deleteTempFiles();
        }
    }

    static void startInstall() throws SpaceException, MemoryException { //생성한 예외처리 호출
        if (!enoughMeory()) {
            throw new MemoryException("메모리 확보");
        }
        if (!enoughSpace()) {
            throw new SpaceException("공간 부족");
        }
    }

    static void copyFiles() {
    }

    static void deleteTempFiles() {
    }

    static boolean enoughSpace() {
        return true;
    }

    static boolean enoughMeory() {
        return false;
    }
}


    class SpaceException extends RuntimeException {
        SpaceException(String msg){  //spaceException의생성자
            super(msg); //조상인 RunTime의 생성자 호출
        }
    }
    class MemoryException extends RuntimeException {
        MemoryException(String msg){
            super(msg);
        }
    }

 

+ Recent posts