▸JAVA/기본 문법

예외(Exception) 처리하기_throws [4/5]

코데방 2019. 12. 13.
728x90

[ throws ]

  • 예외를 직접 처리하지 않고 '던지는' 것
  • JVM에서 생성된 예외 객체를 직접 처리하지 않고 메소드를 호출한 곳으로 넘겨줌 (리턴과 비슷)
  • 예외 객체가 반환되면 메소드를 호출한 곳에서는 그 예외 객체를 처리(catch)해줘야 함

메소드의 리턴값과 같이, throws가 선언된 생성자나 메소드는 실행 중 발생한 예외 객체를 직접 처리(catch)하지 않고 호출한 곳에 반환해줍니다. 메소드의 리턴값은 그냥 무시해도 되지만 예외 객체는 무시할 수가 없는 것이라 호출한 쪽에서 꼭 처리를 해줘야 합니다. 파일 입출력 기능을 가진 FileInputStream 클래스는 파일을 열고 읽는 등의 생성자와 메소드를 실행할 때 예외 처리가 없으면 컴파일 에러가 납니다. 그 이유는 아래와 같이 throws가 선언되어 있기 때문입니다.

public FileInputStream(String name) throws FileNotFoundException
public int read() throws IOException

 

따라서 위와 같이 throws로 선언된 예외 객체 타입을 호출한 곳에서 적절히 처리해줘야 에러가 나지 않습니다. 또는 호출하는 곳에서도 throws로 다른 곳으로 예외 객체를 던져줄 수도 있습니다. 다만 main() 메소드는 JVM에서 호출하는 것이므로 main() 메소드에서 throws를 선언할 경우 예외 처리를 하지 않은 것과 마찬가지입니다.

 


 

이렇게 throws를 이용해서 호출한 쪽에 예외 객체를 던져주는 이유는, 클래스를 사용하는 사용자가 예외에 대해 어떻게 대처할지 직접 작성할 수 있도록 하기 위함입니다. 예를 들어 파일열기에서 예외가 발생할 경우 미리 "파일이 없습니다." 라고 출력되도록 지정해뒀다면 FileInputStream 클래스를 사용하는 모든 프로그램에서 같은 메세지를 출력하게 될 것입니다. 하지만 throws를 선언하여 사용자가 직접 예외처리 구문을 작성하거나, 다른 로직을 짤 수 있으므로 같은 클래스를 사용하더라도 다른 방식으로 예외에 대한 대응을 할 수 있는 것입니다. 

 

사용법은 간단합니다. 각각의 예외 객체를 모두 던져줘도 되고, 그냥 하나의 Exception 클래스로 던져줘도 됩니다. 

package study.first;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test {

	public static void test() throws FileNotFoundException, IOException{

		FileInputStream fi = new FileInputStream("a.txt");
		fi.close();		
	}
}
package study.first;

import java.io.FileInputStream;

public class Test {

	public static void test() throws Exception{

		FileInputStream fi = new FileInputStream("a.txt");
		fi.close();		
	}
}

 

그리고 호출한 쪽에서는 메소드에서 던져주는 객체타입을 처리해주면 됩니다. 역시 'try-catch'문으로 메소드를 호출하고 예외 처리를 하면 됩니다. 기본 라이브러리 사용법과 동일합니다.

package study.first;

public class Main {
	public static void main(String[] args) {
		
		Test t1 = new Test();
		
		try {
			
			t1.test();
			
		} catch(Exception ex) {
			
			System.out.println("예외처리부분");
			
		}	
	}
}

 

728x90

댓글

💲 추천 글