본문 바로가기
언어/JAVA

예외 처리 방법(처리하기, 미루기)

by step 1 2021. 5. 23.
반응형

try-catch 문

try 블록에서 예외가 발생할 가능성이 있는 코드를 작성하고 try 블록 안에서 예외가 발생하는 경우 catch 블록이 수행됨

try {
	예외가 발생할 수 있는 코드 부분
} catch(처리할 예외 타입 e) {
	try 블록 안에서 예외가 발생했을 때 예외를 처리하는 부분
}

프로그래머가 예외를 처리해줘야 하는 예(배열의 오류 처리)

예외처리를 안해줄경우 밑에 log가 수행되지 않는다.

package ch56;

public class ArrayIndexException {

	public static void main(String[] args) {
		
		int[] arr = {1,2,3,4,5};
		
//		for(int i = 0; i <= 5; i++) {
//			System.out.println(arr[i]);
//		}
		
		try {
			for(int i = 0; i <= 5; i++) {
				System.out.println(arr[i]);
			}
		}catch (ArrayIndexOutOfBoundsException e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
			System.out.println(e.toString());
		}
		
		System.out.println("here!!");
	}
}

 

try-catch- finally 문

  • finally 블럭에서 파일을 닫거나 네트웍을 닫는 등의 리소스 해제 구현을 함
  • try{} 블럭이 수행되는 경우, finally{} 블럭은 항상 수행 됨
  • 여러 개의 예외 블럭이 있는 경우 각각에서 리소스를 해제하지 않고 finally 블럭에서 해제하도록 구현함

컴파일러에 의해 예외가 처리 되는 예(파일 에러 처리)

package ch56;

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

public class FileExceptionHanding {

	public static void main(String[] args) {
		
		FileInputStream fis = null;
		
		try {
			
			fis = new FileInputStream("a.txt");
			
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
			// return;
		} finally {
			
			if (fis != null) {
				
				try {
					fis.close();
				} catch (IOException e2) {
					// TODO: handle exception
					e2.printStackTrace();
				}
			}
			System.out.println("항상 수행");
		}
		System.out.println("여기도 수행");
	}
}

 

try-with-resources 문

  • 리소스를 사용하는 경우 close() 하지 않아도 자동으로 해제 되도록 함
  • 자바 7부터 제공되는 구문
  • 리소스를 try() 내부에서 선언해야만 함
  • close()를 명시적으로 호출하지 않아도 try{} 블록에서 열린 리소스는 정상적인 경우나 예외가 발생한 경우 모두 자동으로 해제됨
  • 해당 리소스 클래스가 AutoCloseable 인터페이스를 구현 해야 함
  • FileInputStream의 경우에는 AutoCloseable을 구현하고 있음
  • 자바 9부터 리소스는 try() 외부에서 선언하고 변수만을 try(obj)와 같이 사용할 수 있음

AutoCloseable 예제

package ch56;

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

public class FileExceptionHanding2 {

	public static void main(String[] args) {
		
//		FileInputStream fis = null;
		
//		자동으로 close 됨
		try (FileInputStream fis = new FileInputStream("a.txt")){
			
			System.out.println("read");
			
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		System.out.println("end");
	}
}

 

AutoCloseable 인터페이스 구현 실습

AutoCloseableObj.java

package ch56;

import java.io.FileInputStream;

public class AutoCloseableObj implements AutoCloseable{

	@Override
	public void close() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("closing....");
		
	}

	
}

AutoCloseTest.java

package ch56;

import java.io.FileInputStream;

public class AutoCloseTest {

	public static void main(String[] args) {
		
		AutoCloseableObj obj = new AutoCloseableObj();
		
		try(obj) {
//			exception 강제로 생성
//			throw new Exception();
			FileInputStream fis = new FileInputStream("a.txt");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("exception");
			e.printStackTrace();
		}
		
		System.out.println("end");
	}
}

반응형

'언어 > JAVA' 카테고리의 다른 글

사용자 정의 예외 클래스  (0) 2021.05.23
예외 처리 방법(처리하기, 미루기) 2  (0) 2021.05.23
예외 처리 설명  (0) 2021.05.22
스트림을 활용하여 패키지 여행 비용 계산하기  (0) 2021.05.22
reduce() 연산  (0) 2021.05.22