본문 바로가기

JAVA

예외 종류에 따른 처리코드

반응형

다중 catch

 

블록 내부는 다양한 종류의 예외가 발생할수 있다. 이 경우, 발생되는 예외별로 처리코드를 다르게 하려면 어떻게 해야할까? 이것에 대한 해답은 다중 catch 블록을 작성하는 것이다. catch 블록의 예외 클레스 타입은 try 블록에서 발생된 예외의 종류를 말하는데 try 블록에서 타입의 예외가 발생하면 catch 블록을 실행하도록 되어 있다.

 

 

 

catch 블록이 여러개라고 할지라도 단하나의 catch 블록만 실행된다.

그 이유는 try 블록에서 동시 다발적으로 에외가 발생하지 않고 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문이다.

 

 

NumberFormatException 이 발생하면 첫번째 catch 블록을 실행하고 그밖의 다른 예외가 발생하면 두번째 catch 블록을 실행한다.

 

멀티 catch

 

 

 

자바 7부터 하나의 catch 블록에서 여러 개의 예외 처리할 수 있도록 멀티(muti) catch 기능을 추가 했다. 

 

 

 

 

자동 리소스 닫기

자바 7에서 새로 추가된 try - with -resource 를 사용하면 예외발생 여부와 상관없이 사용했던 리소스 객체 의 close() 메소드를 호출해서 안전하게 리소를 닫아준다. 리소스 라는 말이 생소하게 드릴지도 모르겠다. 리소스란 여러 가지 의미가 있겠지만 여기서는 데이터를 읽고 쓰는 객체라고 생각해두자. 예를 들어 파일의 데이터를 읽는 FileInputStream 객체와 파일에 쓰는 OutputStream은 리소스 객체라고 보면된다.

 

 

 

 

 

 

finally블록에서 다시 try - catch 를 사용해서 close() 메소드를 예외처리 해야하므로 다소 복잡하게 보인다. try - with - resource 를 사용하면 오른쪽 그림처럼 간단해진다. 어디를 봐도 close()를 명시적으로 호출한곳이 없다.

try블록이 정상적으로 실행을 완료했거나 예외가 발생하게 되면 자동으로 FileInputStream의 close() 메소드가 호출된다. try{}에서 예외가 발생하면 우선 close() 리소스를 닫고 catch 블록을 실행한다.

 

 

 

 

 

 

 

만약 한개이상의 리소스를 사용해야 한다면 위에 코드처럼 작성해주면된다.

try - with - resource 를 사용하기 위해서는 조건이 있는데 리로스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다. AutoCloseable 에는 close() 메소드를 자동 호출한다.

 

 

 

 API 도큐먼트 에서 AutoCloseable인터페이스를 찾아 "AllKnownImplementingClasses" 보면 try-with-resource와 함께 사용할 수 있는 리소스가 어떤 것이 있는지 알 수 있다.

 

 

 

예외 떠넘기기

 

메소드 내부에서 예외가 발생할 수 있는 코드를 작성할때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다. 이때 사용하는 키워드가 throws이다. throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외르 호출한 곳으로 떠넘기는 역할을 한다. throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면된다.

발생할 수 있는 예외의 종류별로 throws 뒤에 나열하는 것이 일반적이지만,  throws Excetpion만으로 모든 예외를 간단히 떠넘길수 있다.

throws 키워드가 붙어 있는 메소드는 반드시 try 블록내에서 호출되어야 한다. 그리고 catch 블록에서 떠넘겨 받은예외를 처리해야한다. 

 

위에 코드는 throws 키워드가 있는 method2()를 method1()에서 호출하는 방법을 보여준다.

method2() 에서도 try - catch 블록으로 예외처리 하지 않고 throws 키워드로 다시 예외를 떠넘길 수 있다. 그러면 method1() 을 호출하는 곳에서 결국 try-catch 블록을 사용해서 처리해야한다.

 

 

 

forName() 메소드 선언부 뒤에 throws ClassNotFoundException이 붙어 있기 때문에 forName()메소드를 호출할때 try-catch 블록으로 예외처리를 하거나, throws로 예외를 떠넘겨야 한다.

 

 

 

 main() 메소드에서도 throws 키워드를 사용해서 예외를 떠넘길수 있는데 , 결국 JVM이 최종적으로 예외 처리를 하게 된다. JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외처리를 한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'JAVA' 카테고리의 다른 글

배열타입  (0) 2020.11.24
사용자 정의 예외와 예외 발생  (0) 2020.11.16
JAVA 예외처리  (0) 2020.11.15
클래스의 구성 멤버(return)  (0) 2020.11.11
클래스의 구성 멤버(메소드)  (0) 2020.11.11