한 걸음 두 걸음

자바 JAVA ] 예외처리 exception throws / try / throw 본문

Language/Java

자바 JAVA ] 예외처리 exception throws / try / throw

언제나 변함없이 2019. 11. 21. 20:34
반응형

예외처리란?

메소드가 해야 할 일을 수행할 수 없는 상황을 처리하는 것. 예외란, 복구가 가능한 에러를 지칭합니다. (HW전원이 나가는 등의 에러는 복구가 불가능한 에러입니다.(버그)) 자바에서는 예외가 발생했을 경우 이를 처리하는 과정을 분리하여 사용하는 방식을 씁니다.
자바는 에러도 클래스로 구현되어 있습니다. 메소드 안에서 오류가 발생하면 해당 오류를 설명하는 예외 객체를 만들어 런타임 시스템으로 넘깁니다.

예외 계층구조 / checked Exception

Object-Throwable(예외 최상위 클래스)는 Error와 Exception 자식 클래스를 가집니다. Error는 복구할 수 없으므로(IOError) Exception 처리를 하는 방법을 공부해보겠습니다.(단, RuntimeException은 명시적으로 예외처리를 해주지 않아도 됩니다.)

잡기 던지기

  1. 예외를 직접 처리할 때 사용하는 try, catch
    try를 통해 예외를 직접 잡고 이를 catch에 넘겨 바로 처리합니다.
  2. 예외를 직접 처리하지 않고 호출한 곳으로 예외처리의 의무를 넘기는 방식에 쓰이는 throws
    계속 처리를 안해주면 main까지 갔다가 JVM까지 이동할 수 있으므로, 넘기더라도 어디선가(main전까지)는 반드시 처리하는 부분을 작성해주어야합니다.

try{

}catch(예외1 e | 예외2 x){ //한 번에 여러 개의 예외타입을 잡아내는 것도 가능합니다.(상속관계가 없을 경우)
    //catch는 아예 안쓰거나 여러 개 사용할 수 있습니다. 
}catch(예외3 e){

}finally { 
    //예외가 발생하지 않아도 반드시 실행되는 곳, 자원할당해제를 위한 공간으로 쓰입니다.
    //생략 가능합니다.
}

이렇게 사용되던 것이 JAVA7부터는 보다 간결하게 작성할 수 있도록 업데이트되었습니다.(try with resources)
try(자원사용코드){
}
//괄호가 있으면 자원으로 알고 사용 후 끝나면 알아서 해제됩니다.

//리소스 사용 할당 및 해제가 자동으로 되도록 변경 
try( ...자원사용 코드...FileInputStrem in = new ~ ){
    ...실행코드 읽기
}

이를 사용하기 위해서는 java.lang.AutoClosable인터페이스를 구현해주어야 합니다.(BufferedReader클래스가 구현하는 등..)

JAVA9부터는 아래도 지원합니다.

.FileInputStrem in = new ~
try(in){
    ...실행코드 읽기
}

throws는 함수의 헤더에 많이 적어놓습니다. 해당 함수에서 어떤 에러가 발생할 수 있는지 파악하기 쉬워집니다.

public int testMothod throws IOException{

}

예외 다시 던지기

예외를 모아서 한꺼번에 처리하는 방식을 위한 것으로, 예외 발생 시 당장 처리하는 방법은 모르나, 나중에 하는 것이 좋을 경우 사용합니다.

try{

}catch(Exception e){
    throw new CustomException qe;
}

예외처리의 장점

에러 처리를 함으로써 시스템이 다운되는 상황을 막을 수 있다.
정상적인 코드와 에러 발생 시 처리하는 코드를 분리하여 작성할 수 있다.

throw

throw키워드는 예외 객체를 생성하는 키워드입니다.

 void testMethod(){
     if(IOError){
        throw IOException;//시스템예외 객체를 만듦
    }
 }
반응형