아이티클래스

finally문

 

 

예외 상황에는 finally문 사용해 보도록 하자 

 

finally 문을 사용하기 전에 try/catch 문을 모른다면 try/catch 문 부터 공부하기 바랍니다.

 

2020/04/02 - [Java] - try/catch문

 

try/catch문

try/catch문 예외가 발생하는 위치에서 예외를 처리하기 위해서는 try/catch문을 사용한다. try블록 내에는 에러를 발생시킬수 있는 코드를 넣고 catch블록에는 예외의 처리 코드를 포함해야 한다. try { //예외..

veloper.tistory.com

 

finally 키워드에 의해 선언된 finally 블록은 try/catch 문을 수행한 후에 반드시 수행해야 할 코드들이 오게 된다.

 

try 블록에서 예외가 발생하거나 발생하지 않더라도 finally 블록은 항상 수행되며 주로 자원을 반환하는데 사용된다.

 

 

finally 블록은 catch 블록 뒤에 위치하며 만약 catch 블록이 없을 경우에는 try 블록 뒤에 위치하게 된다.

 

try 블록이 없을 경우에는 catch 블록과 finally 블록 둘 다 사용될 수 없다.

 

 

try/catch/finally 문에는 예외가 발생하는 경우발생하지 않는 경우 두가지가 있다.

 

 

try 
{
	//예외를 발생시킬 수 있는 코드
        
        //예외를 발생시키지 않는 코드
}
catch(Exception e)
{
	//발생한 예외를 처리하기 위한 코드
}
finally
{
	//반드시 수행되어야 할 코드(예외상황과 상관없이)
}

 

 

예외가 발생할 경우

 

try 블록에서 예외가 발생했을 경우에는 try 블록내의 나머지 코드들은 실행하지 않고 해당 예외에 대한 catch 블록을 실행한 후 finally 블록내의 코드를 실행한다. 

 

예외를 처리할 catch 블록이 없을 경우에는 try블록에서 finally 블록으로 바로 제어가 넘어가게 된다.

 

이 경우에는 예외를 처리하지 못했기 때문에 try 블록을 가지고 있는 메소드는 종료하게 된다.

 

만약 try 블록이나 catch 블록에 return 문이 있다면 finally 블록을 실행한 후 return 문을 실행하게 된다.

 

finally 블록은 항상 실행된다.

 

하지만 try 블록이나 catch 블록에 System.exit()가 사용될 경우에는 강제로 프로그램이 종료되기 때문에 finally 블록은 실행되지 않는다.

 

물론 System.exit()는 어느 위체에도 사용될 수 있으며 사용될 경우에는 그 이후의 코드는 실행되지 않고 프로그램을 종료시키므로 사용시 주의해야 할 것이다.

 

 

예외가 발생하지 않을 경우 

 

try 블록에서 예외가 발생하지 않았을 경우에는 try 블록내의 코드를 실행한 후 finally 블록을 실행하게 된다.

 

try 블록이나 catch블록에 return 문이 없을 경우에는 finally 블록내의 코드를 실행한 후 finally블록다음에있는코드들도실행한다.

 

하지만 return문이 있을 경우에는 finally 블록내의 코드를 실행한 후 return문을 실행하게 되므로 finally 블록 다음의 코드들은 실행되지 않는다.

 

 

 

//파일경로(pFilePath)를 받아서 Byte로 변환하는 메소드
public static byte[] fileToByte(String pFilePath)
{
	InputStream is = null;
    
    //try구문시작
    try {
    
    	//파일경로(pFilePath)를 file에 담는다
    	File file = new File(pFilePath);
        
        //file을 FileInputStream is에 담는다
        is = new FileInputStream(file);
        
        //파일의 길이를 length에 담는다
        long length = file.length();
        
        //length를 배열 bytes에 담는다
        byte[] bytes = new byte[(int) length];
        
        //int형 offset 선언
        int offset = 0;
        
        //int형 numRead 선언        
        int numRead = 0;
        
        //배열 bytes의 길이 값이 offset의 값보다 클 동안 
        //배열 bytes의 길이 값에서 offset의 값을 뺀값이 0보다 크거나 같을 동안
        while (offset < bytes.length)
        	&& (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
            
            //offset에 numRead을 더해 담는다
        	offset += numRead;   
        }
        
        //bytes.length값이 offset보다 클경우
        if (offset < bytes.length){
        	//예외상황발생
        	throw new RuntimeException("Can't read file");
        }
        
        //결과값 bytes를 반환
    	return bytes;
        
    } catch (FileNotFoundException e) {
    	//파일을 찾지 못할때 예외상황 발생
    	throw new RuntimeException(e);
        
    } catch (MalformedURLException e) {
    	//경로를 찾지 못할때 예외상황 발생
    	throw new RuntimeException(e);   
        
    } catch (IOException e) {
    	//입출력 처리가 중단 되었을때 예외상황 발생
    	throw new RuntimeException(e);
        
    } catch (Exception e) {
    	//그밖에 예외상황 발생
    	throw new RuntimeException(e);
        
    } finally {
    
    	//InputStream is가 null이 아닐때
    	if(is != null) {
        	try {
            	//InputStream is를 close 해준다
            	is.close();
            } catch(IOException e) {
            	//입출력 처리가 중단 되었을때 예외상황 발생
            	throw new RuntimeException(e);
            } catch(Exception e) {
            	//그밖에 예외상황 발생
            	throw new RuntimeException(e);
            }
        }        
    }
}

 

 

파일경로(pFilePath)를 받아서 bytes를 리턴해주는 fileToByte 메소드를 구현해 보았다.

 

주석으로 구문 하나하나 설명했으니 참조하기 바란다.

 

try/catch/finally 문 이외에도 Exception을 많이 사용했기 때문에 Exception의 종류도 구분해 보았다.

 

 

 

ClassNotFoundException 클래스를 찾지 못함 

CloneNotSupportedException Cloneable 인터페이스 미구현

IllegalAccessException 클래스 접근을 못함

InstantiationException 추상 클래스 또는 인터페이스를 인스턴스화 하고자 할때

InterruptedException 쓰레드가 중단 되었을때

NoSuchFieldException 지정된 필드가 없을때 

NoSuchMethodException 지정된 메소드가 없을때


[IOException] CharConversionException 문자 변환에서 예외가 발생했을때

[IOException] EOFException 파일의 끝에 도달했을때

[IOException] FileNotFoundException 파일이 발견되지 않았을때

[IOException] InterruptedIOException 입출력 처리가 중단 되었을때 

[IOException][ObjectStreamException] InvalidClassException 시리얼라이즈 처리에 관한 문제가 클래스 안에 있을때

[IOException][ObjectStreamException] InvalidObjectException 시리얼라이즈된 오브젝트에서 입력 검증에 실패했을때

[IOException][ObjectStreamException] NotActiveException 스트림 환경이 액티브하지 않을 때 메소드를 호출했을때

[IOException][ObjectStreamException] NotSerializableException 오브젝트를 시리얼라이즈 할 수 없을때

[IOException][ObjectStreamException] OptionalDataException 오브젝트를 읽을때 기대 이외의 데이터와 만났을때

[IOException][ObjectStreamException] StreamCorruptedException 읽은 데이터 스트림이 파손되어 있을때

[IOException][ObjectStreamException] WriteAbortedException 기록중에 예외가 발생한 스트림을 읽었을때

[IOException] SyncFailedException 시스템 버퍼를 동기시키는 FileDescriptor.sync()의 호출 실패시

[IOException] UnsupportedEncodingException 지정된 문자 부호화 형식을 지원하고 있지 않을때

[IOException] UTFDataFormatException 부정한 UTF-8방식 문자열과 만났을때


[RuntimeException] ArithmeticException 제로제산 등의 산술 예외 발생시

[RuntimeException] ArrayStoreException 배열에 부정한 형태의 오브젝트를 저장하고자 할때

[RuntimeException] [IllegalArgumentException] IllegalThreadStateException 쓰레드가 요구된 처리를 하기에 적합한 상태에 있지 않을때 

[RuntimeException] [IllegalArgumentException] NumberFormatException 부적절한 문자열을 수치로 변환하고자 할때

[RuntimeException] IllegalMonitorStateException 모니터 상태가 부정일때

[RuntimeException] IllegalStateException 메소드가 요구된 처리를 하기에 적합한 상태에 있지 않을때 

[RuntimeException] [IndexOutOfBoundException] ArrayIndexOutOfBoundsException 범위 밖의 배열 첨자 지정시 

[RuntimeException] [IndexOutOfBoundException] StringIndexOutOfBoundsException 범위 밖의 String 첨자 지정시 

[RuntimeException] NegativeArraySizeException 음의 크기로 배열 크기를 지정하였을때 

[RuntimeException] NullPointerException null 오브젝트로 접근했을때 

[RuntimeException] SecurityException 보안 위반시

[RuntimeException] UnsupportedOperationException 지원되지 않는 메소드를 호출했을때 



 

 

 

 

파비콘

제가 작성한 글이 도움이 되셨다면 ♥공감을 꾹 눌러주세요

 

도움이 필요한 내용이 있으시다면 댓글도 남겨주세요

 

 

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band