728x90
반응형
SMALL

예외와 예외 클래스

에러(Error) : 컴퓨터 하드웨어의 고장으로 인해 응용프로그램 실행 오류가 발생하는 것

예외(Exception) : 잘못된 사용 또는 코딩으로 인한 오류

 

예외의 종류

* 일반 예외(Exception) : 컴파일러가 예외 처리 코드 여부를 검사하는 예외를 말한다.

* 실행 예외(Runtime Exception) : 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외를 말한다.

 

예외 처리 코드

예외 처리 코드는 try-catch-finally 블록으로 구성된다.

try{
	//예외 발생 가능 코드
} catch{
	//예외 처리
} finally{
	//항상 실행;
}

1) try 블록에서 작성한 코드가 예외 없이 정상 실행되면 catch 블록은 실행되지 않는다.

2) try 블록에서 예외가 발생하면 catch 블록이 실행된다.

3) finally 블록은 예외 발생 여부와 상관없이 항상 실행된다.

 

package ch11.sec02.exam01;


public class ExceptionHandlingExampl2 {
	public static void printLength(String data) {
		try{
			int result= data.length();
			System.out.println("문자 수 : "+result);
		}catch (NullPointerException e) {
			System.out.println(e.getMessage());
		}finally {
			System.out.println("[마무리 실행]\n");
		}
		
	}
	
	public static void main(String[] args) {
		System.out.println("[프로그램 시작]\n");
		printLength("ThisIsJava");
		printLength(null);
		System.out.println("[프로그램 종료]");
	}
}

 

예외 종류에 따른 처리

다양한 종류의 예외는 다중 catch를 사용하면 예외에 따라 다르게 작성할 수 있다.

try{

	ArrayIndexOutOfBoundsException 발생 //예외 발생1
    
   	NumberFormatException 발생 //예외 발생2
    
} catch(ArrayIndexOutOfBoundsException e){
	//예외 처리1
} catch(NumberFormatException e){
	//예외 처리2
}

*처리해야 할 예외 클래스들이 상속관계일 때 하위 클래스 catch 블록을 먼저 작성하고 상위 클래스 catch 블록을 나중에 작성해야 한다.

 

리소스 자동 닫기

리소스 : 데이터를 제공하는 객체.

리소스를 사용하기 위해 열어야(open)하며, 사용 끝난 후에는 닫아야(close)한다. 리소스 사용 중 예외가 발생될 경우에도 안전하게 닫아야 한다.

FileInputStream fis = null;
try{
	fis = new FileInputStream("file.txt");
    ...
} catch(IOException e){
	...
} finally{
	fis.close();
}

 

리소스 자동 닫는 코드

try() 괄호에 리소스를 여는 코드를 작성하면 try 블록이 정상적으로 실행을 완료했거나 예외가 발생해도 자동으로 리소스의 close() 메소드가 호출된다.

try(FileInputStream fis = new FileInputStream("file.txt")){
	...
}catch(IOException e){
	...
}

복수 개의 리소스를 사용해야 한다면 try() 괄호 안에 세미콜론(;)으로 구분한다.

try(FileInputStream fis = new FileInputStream("file.txt");
	FileInputStream fis2 = new FileInputStream("file2.txt")){
	...
}catch(IOException e){
	...
}

 

예외 떠넘기기

메소드 내부에서 예외가 발생할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 메소드를 호출한 곳으로 예외를 떠넘길 수 있다.

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

 

사용자 정의 예외

표준 라이브러리에 존재하지 않으면 직접 예외 ㅋㄹ래스를 정의해서 사용해야 한다.

public class XXXException extends [ Exception | RuntimeException ] {
	public XXXEcveption(){
    	//기본 생성자
    }
    
    public XXXException(String message){
    	super(message);
    }
}

 

예외 발생 시키기

사용자 정의 예외를 직접 코드에서 발생시키려면 throw 키워드와 함께 예외 객체를 제공한다.

//직접 try-catch 블록으로 예외 처리
void method(){
	try{
    	...
        throw new Ecveption("예외메시지");
        ...
    }catch(Exception e){
    	String message = e.getMessage();
    }
}
//메소드를 호출한 곳에서 예외를 처리하도록 throws로 예외 떠넘기기
void method() throws Exception{
	...
    throw new Exception("예외메시지");
    ...
}
728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #13 제네릭  (0) 2023.04.24
[JAVA] #12 java.base 모듈  (0) 2023.04.20
[JAVA] #10 라이브러리 모듈  (0) 2023.04.18
[JAVA] #9 중첩 선언과 익명 객체  (0) 2023.04.17
[JAVA] #8 인터페이스  (0) 2023.04.14

+ Recent posts