9주차 과제:예외 처리

2021. 1. 18. 18:20[WhiteShip]Java

  • Exception과 Error의 차이는?
  • 자바가 제공하는 예외 계층 구조
  • 자바에서 예외처리하는 방법
  • RuntimeException과 RE가 아닌 것의 차이는?
  • 커스텀한 예외 만드는 방법

1.Exception과 Error의 차이는?


자바에서 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 에러(error)라고 합니다. 그리고 에러 이외에 프로그램 자체에서 발생하는 오류는 예외(exception)이라고 부릅니다.

예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 비슷합니다. 하지만 예외는 예외처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있습니다.

 

예외는 두 가지 종류가 있습니다. 하나는 일반 예외(컴파일러 체크 예외), 다른 하나는 실행 예외(runtime exception)입니다.

 

일반 예외는 프로그램 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사합니다. 그리고 예외 처리 코드가 없다면 컴파일 오류가 발생합니다.

실행 예외는 실행 시 예측할 수 없이 갑자기 발생하기 때문에 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않습니다.

2.자바가 제공하는 예외 계층 구조


https://madplay.github.io/post/java-checked-unchecked-exceptions

예외는 크게 checked exception와 unchecked exeception로 나뉘어 진다.

runtime exception외에는 전부 checked exeption이기에 일반 예외와 실행 예외로 구분하기도 한다.

 

Checked Exception

->프로그램 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사합니다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생합니다.

 

Unchecked Exception

->실행 시 예측할 수 없이 갑자기 발생하기 때문에 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않습니다.

3.자바에서 예외처리하는 방법

try-catch-finally 블록

1.try 블록에는 예외 발생 가능 코드가 위치합니다.

2.try 블록의 코드가 예외 발생 없이 정상 실행되면 catch  블록의 코드는 실행되지 않고 finally블록의 코드를 실행합니다. 만약 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외처리 코드를 실행합니다. 그리고 finally 블록의 코드를 실행합니다.

3.finally 블록은 생략가능하며 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에만 finally 블록을 작성해주면됩니다.

try{
	//예외 발생 가능 코드
}catch(예외클래스 e1){
	//예외클래스 e1이 발생하였을 때,이를 처리하기 위한 코드
}catch(예외클래스 e2){
	//예외클래스 e2이 발생하였을 때,이를 처리하기 위한 코드
}finally{
	//항상 실행;
}

try 블록에는 여러 개의 catch 블록이 들어올 수 있으며, 예외가 발생하면 단 하나의 catch 블록만 실행됩니다.

다중 catch 블록을 작성할 때 주의해야 할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다는 것입니다. 그 이유는 예외 처리해줄 catch 블록은 위에서 차례대로 검색되는데 상위 예외 클래스의 catch 블록이 위에 있다면, 하위 예외 클래스의 catch 블록은 실행 되지 않기 때문입니다.

 

throw

->throw를 이용해 의도적으로 예외를 발생시킬 수 있다.

public class ThrowTest{
	public static void main(String[] args){
    	String text ="";
        if(text==null){
        	throw new IOExceoption("text is null");
        }
        return text;
    }
}

throws

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

throws 키워드가 붙어 있는 메소드는 반드시 try 블록 내에서 호출되어야합니다.

public void method1(){
	try{
    	method2();
 	}catch(ClassNotFoundException e){
    	//예외 처리 코드
    }
}
public void method2() throws ClassNotFoundException{
	Class class = Class.forName("Test");
}

 

4.커스텀한 예외 만드는 방법

->기존에 정의된 예외클래스 이외에 사용자가 필요에 따라 새로운 예외를 정의할 수 있다.

https://wisdom-and-record.tistory.com/46