본문 바로가기

Java

Live Study _ 09주차. 예외 처리

학습 할 것 

1. 자바에서 예외 처리 방법 

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

3. Exception과 Error의 차이는?

4. RuntimeException과 RE가 아닌 것의 차이는?

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

 


 

1. 예외 처리 방법 및 코드 :

WHY -

예외 처리 코드를 사용하는 이유는 프로그램의 갑작스로운 종료를 막고 정상 실행을 유지할 수 있도록 처리하기 위해서 사용된다. 

 

HOW -

자바 컴파일러가 소스파일을 컴파일 할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 오류를 발생시켜 개발자로 하여금 강제적으로 예외 처리 코드를 작성하도록 요구한다. BUT! 실행 예외는 컴파일러가 체크해주지 않기 때문에 예외 처리 코드를 개발자의 경험을 바탕으로 작성해야 된다. 

 

예외 처리 코드는 try, catch, finally 블록을 이용하여 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다. 

 

try Statement

기본 설명 :

try 블록에서는 예외 발생 가능 코드가 위치하고 try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드를 실행한다. 

 

만약 try 블록의 코드에서 예외가 발생되면 실행이 멈추고 catch 블록에서 예외 처리 코드를 실행한다. 그리고 finally 블록의 코드를 실행된다. finally 블록은 생략이 가능하다. 예외 발생 여부와 상관없이 항상 실행할 내용이 있으면 finally 블록에 코드를 작성하면 된다. 

 

사진 예시 설명 :

1. Class.forName() 메소드는 매개값으로 주어진 클래스가 존재하면 Class 객체를 리턴하지만, 존재하지 않으면 
ClassNotFoundException 예외를 발생시킨다. 

 

2. 7라인에서 java.lang.String2라는 클래스가 없기에 ClassNotFoundException이 발생한다. 이렇게 예외가 발생되면 

8라인에서 예외 처리를 해야된다. 

 

3. ArrayIndexOutOfBoundsException이나 NumberFormatException과 같은 실행 예외는 컴파일러가 예외 처리 코드를 체크하지 않기 때문에 개발자의 경험에 의해 예외 처리를 작성해줘야 된다. 

 

다중 catch Statement 

try 블록 내부에 다양한 종류의 예외가 발생할 수 있다. 이때 다중 catch 블록을 작성하면 해결할 수 있다. 

catch 블록의 예외 클래스 타입은 try블록에서 발생된 예외의 종류를 말하는데, try 블록에서 해당 타입의 예외가 발생하면 catch 블록을 실행하도록 되어 있다. 

 

catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행된다. 왜냐하면 try 블록에서 동시 다발적으로 예외가 발생하지 않고 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문이다. 

 

예외 떠넘기기 throws Statement 

기본 설명 :
메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다. 이때 사용하는 키워드가 throws이다. 

 

throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않는 예외를 호출한 곳으로 떠넘기는 역할을 한다. 사용 할 때 throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면 된다. 

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

 

2. 예외 계층 구조 :

Throwable :

예외와 오류에 대한 상위 클라스로 해당 클래스를 상속 받아서 throw, catch 문을 사용할 수 있는 parameter가 된다.

 

Exception / RuntimeException :

예외에는 두 가지 종류가 있다. 하나는 일반 예외(Exception)이고 다른 하는 실행 예외(RuntimeException)이다.

- 일반 예외는 컴파일러 체크 예외라고도 한다. 왜냐하면 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문이다. 

- 실행 예외는 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 뜻한다. 

- 이 둘의 차이점은 컴파일 시 예외처리를 확인하는 차이일뿐 두 가지 예외는 모두 예외 처리 코드가 필요하다.  

 

3. Exception과 Error의 차이점 :

 

Exception Error
실행 도중 중단될 정도로 큰 문제가 아닐 때 발생.
대처 가능한 경우. 
런타임 시 처리 가능함.
예) SQLException / NullPointerException
대처 불가능.
런타임 시 발생되며 전부 예측 불가능한 Unchecked Error.
런타임 시 처리 불가능함.
예) stackoverflowError / outofmemoryError

4. RuntimeException과 RE

 

RuntimeException은 UncheckedException에 속한다. 오로지 개발자의 경험에 의해서 예외 처리 코드를 작성해야 된다. 그럼으로써 실행 예외를 잘 익혀두어야 된다. 

 

Exception(일반예외)과 RuntimeException(실행예외) 클래스를 구별하는 방법은 일반 예외는 Exception을 상속 받고 실행 예외는 RuntimeException을 상속받는다. 위에 그림을 보면 RuntimeException도 Exception을 상속받지만 JVM은 RuntimeException을 상속했는지 여부를 보고 실행 예외를 판단한다.