07
29
728x90

try-with-resources

예외 발생 여부와 관계없이 사용했던 리소스 객체(각종 입출력스트림, 서버소켓, 소켓, 각종채널)의 close() 메소드를 호춯해서 안전하게 리소스를 닫아준다.

리소스 : 데이터를 읽고 쓰는 객체

 

예제)

package sec05_try_with_resourcse;

public class FileInputStream implements AutoCloseable 
{
	private String file;
	
	public FileInputStream(String file)
	{
		this.file = file;
	}
	
	public void read()
	{
		System.out.println(file+"을 읽습니다.");
	}
	
	@Override
	public void close() throws Exception 
	{
		System.out.println(file + "을 닫습니다.");

	}
}
package sec05_try_with_resourcse;

public class TryWithResourcesExample 
{
	public static void main(String[] args) 
	{
		try(FileInputStream fis = new FileInputStream("file.txt"))
		{
			fis.read(); // try블록이 끝나면 자동적으로 fis의 close()가 실행됨
			throw new Exception(); //예외 발생코드
		}
		catch(Exception e)
		{
			System.out.println("예외 처리 코드가 실행되었습니다."); //예외발생코드때문에 실행됨
		}
	}
}

출력 결과

 

throws

메소드 선언부 끝에 작성

리턴타입 메소드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ...
{
}

메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할

public void method1() throws ClassNotFoundException
{
       method2();
}

클래스 생성자와 메소드 선언부에 throws 키워드가 붙어있으면 try-catch 블록으로 예외처리를 해야한다. 아니면 throws를 다시 사용해서 예외를 호출한 곳으로 떠넘겨야 한다. 그렇지 않으면 컴파일 오류가 발생한다.

 

예제)

package sec06_throws;

public class ThrowsExample 
{
	public static void main(String[] args) 
	{
		try
		{
			findClass(); //반드시 호출하는곳에서는 예외처리를 해주어야함.

		}
		catch(ClassNotFoundException e)
		{
			System.out.println("클래스가 존재하지 않습니다.");
		}
	}
	
	//메소드를 호출한 곳으로 예외를 떠넘길것임
	public static void findClass() throws ClassNotFoundException
	{
		Class clazz = Class.forName("java.lang.String2"); //존재하지 않는 클래스를 제공 (오류가 발생 / 예외처리 해줘야함)
		
	}
}

출력 결과

 

728x90
COMMENT