본문 바로가기
Language/JAVA

[JAVA] 예외처리(try ~ catch)

by 바까 2020. 7. 2.
반응형

<오류와 예외의 차이>

오류
  • 컴파일 오류(copiler error) : 프로그램 코드 작성 중 발생하는 문법적 오류
  • 실행오류 : 실행중인 프로그램이 의도하지 않은 동작을 하거나(bug), 프로그램이 중지되는 오류
  • 실행 오류 시 비정상 종료는 서비스 운영에 치명적
  • 오류가 발생할 수 있는 경우에 로그(log)를 남긴다.
  • 시스템 오류 : 가상머신에서 발생한다. 프로그래머가 처리할 수 없다. -> 동적 메모리가 없는 경우, 스택 오버 플로우 등

 

예외
  • 프로그램에서 제어 할 수 있는 오류

->읽어 들이려는 파일이 존재하지 않은 경우, 네트워크 연결이 끊어진 경우

 

[참고]

예외처리 계층구조


예외처리 try - catch 문
try{

   	예외가 발생 할 수 있는 코드;
    
}catch(처리할 예외타입 e){

	try 블록안에서 예외가 발생했을 때 예외를 처리하는 코드;
    
}

[실습]try -catch문 실행하기

public class ArrayExceptionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//길이가 5인 정수형 배열 생성
		int[] arr = new int[5];
		
		try {
			for(int i=0; i<=5; i++) {
				arr[i]=i;
				System.out.println(arr[i]);
			}
		}catch(ArrayIndexOutOfBoundsException e){
			System.out.println(e);
			System.out.println("예외발생해서 처리");
		}
		System.out.println("프로그램종료");
		
	}

}

 

*예외처리를 하지않은 경우, 오류 이후 더이상 프로그램을 실행하지 않아서 "프로그램종료"라는 출력문을 출력하지 못한다.

public class ArrayExceptionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//길이가 5인 정수형 배열 생성
		int[] arr = new int[5];
		
		
		for(int i=0; i<=5; i++) {
			arr[i]=i;
			System.out.println(arr[i]);
		}
		
		System.out.println("프로그램종료");
		
	}

}

 

[실습]try -catch문 실행하기2

public class FileExceptionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//파일 읽어오기
		//FileInputStream fiso = new FileInputStream("a.txt"); 파일이 없기 때문에 오류
		
		
		try {
			
			FileInputStream fiso = new FileInputStream("a.txt");
			
		} catch (FileNotFoundException e) {
			
			// TODO Auto-generated catch block
			//System.out.println(e);
			System.out.println("지정된 파일을 찾을 수 없습니다");
		}
		System.out.println("프로그램 종료");
	}

}

 


try-catch-finally 문

 

  • finally 에서 프로그램 리소스를 정리한다.
  • try{} 블록이 실행되면 finally{}블록은 항상 실행된다.
  • 리소스를 정리하는 코드를 각 블록에서 처리하지 않고 finally에서 처리한다.
try{
	예외가 발생할 수 있는 코드;
}catch(처리할 예외타입 e){
	try 블록 안에서 예외가 발생했을 때 예외를 처리하는 코디
}finally{
	항상 수행되는 코드;
}

 

[실습]try -catch-finally문 실행하기

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

public class FinallyTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		FileInputStream fis = null; 
		
		try {
			fis = new FileInputStream("a.txt");
		}catch(FileNotFoundException e) {
			//System.out.println(e); 
			e.printStackTrace();
		}finally {
			//파일입력 스트림이 열려 있다면
			if(fis != null) {
				try {
					fis.close();
				}catch(Exception e) {
					e.printStackTrace();
				}
				
			}
			System.out.println("항상수행된다.");
		}
		System.out.println("프로그램 정료");
	}

}


try - with - resources 문

 

  • 리소스를 자동 해제 하도록 제공해주는 구문
  • 자바 7부터 제공
  • close()를 명시적으로 호출하지 않아도 try{} 블록에서 열린 리소스는 정상적인 경우, 예외 발생한 경우 모두 자동해제 된다.
  • 해당 리소스가 AutoCloseable를 구현해야한다.
  • FileInputStream의 경우 AutoCloseable을 구현하고 있다.

[실습]AutoCloseable 인터페이스 구현하기

//AutoCloseable인터페이스를 구현
public class AutoCloseObj implements AutoCloseable {

	@Override
	public void close() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("리소스가 close()되었습니다.");
	}

}

 

[실습]try - with - resources문 실행하기

public class AutoCloseTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try(AutoCloseObj obj = new AutoCloseObj()){//사용할 리소스 선언
			throw new Exception(); //강제적으로 예외를 발생시키는 키워드 throw
		}catch(Exception e) {
			System.out.println("예외부분입니다.");
		}
		
	}

}


 

 

반응형

댓글