JAVA

[JAVA] 예외처리(Exception Handling) (자바 독학하기20)

자라는레몬 2021. 7. 14. 23:42
반응형

자바에서 예외는 문법 오류가 아닌 실행 중간 발생하는 정상적이지 않은 상황이다.

따라서 이클립스에서 에러를 띄우지 않지만 console 창에서 exception message 를 출력한다.

다음과 같이 정수 3을 0으로 나누면 / by zero 라고 하면서 java.lang.ArithmeticException 이라고 출력된다.

이는 예외 클래스 ArithmeticException 의 인스턴스를 생성하고 이 인스턴스를 처리하지 않아 나타나는 현상이다.

 

이러한 예외를 처리하기 위해 try ~ catch 문을 사용한다.

try {

    관찰영역

}

catch(Exception name) {

    처리 영역

}

의 기본 구조를 가진다.

- try 영역에서 발생한 예외 상황을 catch 영역에서 처리한다.

catch 문은 if else 문처럼 여러번의 구성이 가능하다.

또한 catch(Exception1 | Exception2 name) 과 같이 하나의 catch 문에서 여러 예외처리가 가능하다.

이와 같이 try ~ catch 문으로 예외처리를 해주면 코드는 정상적으로 동작하며, 예외처리로 만들어 놓은 catch 문을 통해 / by zero 라는 문장이 출력된다.

 

 

예외 클래스의 최상위 클래스는 

java.lang.Throwable

이다.

이 클래스의 대표적인 메소드들은

public String getMessage()    //예외의 원인을 담고 잇는 문자열을 반환

public void printStackTrace()    //예외가 발생한 위치와 호출된 메소드의 정보를 출력

이 있다.

이와 같이 printStackTrace 를 사용하면 Exception.main 이라는 메소드의 12번째 라인에서 예외가 발생했다고 출력함을 알 수 있다.

 

 

예외 클래스의 최상위 클래스인 Throwable 을 상속하는 예외 클래스는 세 부류로 나뉜다.

Error 클래스를 상속하는 예외 클래스

Exception 클래스를 상속하는 예외 클래스

RuntimeException 클래스를 상속하는 예외 클래스 (RuntimeException 클래스는 Exception 클래스를 상속한다.)

 

여기서 Error 클래스를 상속하는 에외 클래스는 VirtualMachineError(가상 머신에 심각한 오류 발생) 와 IOError(입출력 관련해서 코드 수준 복구가 불가능한 오류 발생) 가 있는데 이 두 예외는 처리할 수 있는 예외가 아니다. 

따라서 Error 클래스를 상속하는 예외는 처리 대상이 아니기 때문에 예외가 발생하면 그냥 프로그램이 종료되도록 놔두고 나중에 원인을 파악해야 한다.

 

 

예외 처리를 최종적으로 호출되는 곳이 아니라 이전의 호출 되는 부분으로 넘길 수도 있다.

예를 들어 A 라는 메소드에서 내에서 예외가 발생하는데 이 예외처리를 A 가 아니라 A 메소드를 호출하는 B 메소드에서 처리 하고자 한다면

public static void A() throws IOException {...}

과 같이 작성하여 IOException 이 발생하면 B 메소드에서 예외처리를 한다고 표시를 한다.

이 throws 선언은 여러가지 예외를 , 로 나열하여 넘길 수도 있다.

 

이러한 방법을 이용하면 예외 클래스를 직접 작성하여 자신이 정의한 예외가 발생하게 할 수도 있다.

 

try {

    ...

}

catch(exception name){

    ...

}

finally{

    ...

}

와 같이 finally 구문이라는 것을 추가 할 수도 있다.

catch 문을 제외하여 try ~ finally 문으로도 구성할 수 있다.

- finally 문은 코드 실행이 try 문으로 들어오면 finally 문의 내용이 무조건 실행된다.

이는 예외가 발생하더라도 무조건 실행되어야 하는 내용을 작성할 때 사용된다.

 

이러한 finally 문을 더 단순화한 문장이 있는데 이게 try-with-resource 문이다.

try(resource) {

    ...

}

catch(exception name){

    ...

}

와 같이 구성한다.

이 resource 에는 종료의 과정을 필요로 하는 리소스를 생성할 수 있다.

File.newBufferedWriter() 와 같이 writer.close() 의 호출이 반드시 필요한 문장도 resource 의 위치에 넣으면 writer.close() 의 호출을 하지 않아도 되는 것이다.

반응형