Java 파트10-2. 예외 처리

1. 시작하기 전에


  • 예외 처리의 목적
    • 프로그램의 갑작스러운 종료를 막기
    • 정상 실행을 유지할 수 있도록
  • 예외 처리 코드
    • 자바 컴파일러는 일반 예외를 발생시키는 코드를 발견할 경우 예외 처리 코드를 강제로 요구
    • 실행 예외는 컴파일러가 체크하지 않으므로 개발자가 경험으로 예외 처리 코드 작성


2. try-catch-finally 블록


  • 생성자 및 메소드 내부에서 작성되어 일반예외와 실행예외가 발생하는 경우 예외 처리를 가능하게 함
  • finally 블록은 개발자의 선택에 따라 작성해도 안해도 된다.
  • 예외클래스 뒤에 오는 e는 출력결과에서 볼 수 있듯이 예외에 대한 설명이다.

그림1

예외가 발생되었을 경우, 바로 밑에 코드는 실행하지 않고 바로 catch 블록으로 넘어간다.

// 예시
package sec01.exam02;

public class TryCatchFinallyRuntimesExceptionExample {
	public static void main(String[] args) {
		
		String data1=null;
		String data2=null;
		
		try {
			data1 = args[0];
			data2 = args[1];
		} catch(Exception e) {
			System.out.println("실행 매개값의 수가 부족");
			return; // return이 있어도 finally문은 실행된다.
		} finally {
			System.out.println("다시 실행하시오");
		}
		
	}
}


3. 다중 catch


  • 발생하는 예외별로 예외 처리 코드를 다르게 하는 다중 catch 블록을 가질 수 있음

그림2

ArrayIndexOutOfBoundException이 발생하면 아래 코드는 실행하지 않고 catch (ArrayIndexOutOfBoundException e) 예외처리만 하고 다음 예외처리는 하지 않고 넘어간다. ArrayIndexOutOfBoundException은 발생하지 않고 NumberFormatException이 발생하는 경우 NumberFormatException 아래는 실행되지 않고 catch(NumberFormatException)로 바로 넘어간다.
Exception은 모든 예외의 부모이므로 catch(Exception e)를 맨 위에 작성하면 다 catch(Exception e)로만 가게 된다. 따라서 이때는 catch(Exception e)을 맨 마지막에 작성해야 한다.


4. 예외 떠넘기기


throws 키워드

  • 메소드에서 처리하지 않은 예외를 호출한 곳으로 넘기는 역할
  • 메소드를 호출한 곳마다 예외처리를 다양한 방식으로 처리할 수 있도록 함
  • throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분하여 나열

쉽게 이해하자면, try-catch를 쓰지 않고 일반적인 실행문에서 예외가 발생했을 경우 그 예외는 어딘가로 가져가라라고 하기 위해서 사용하는 것이다.

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

}
// 예외클래스가 너무 많으면 throws Exception을 사용

그림3

method2는 예외가 발생하면 자신이 예외처리를 하지 않고 catch(ClassNotFoundException e)로 가서 예외처리 한다.


5. 정리하기


  • 예외 처리 : 예외가 발생할 경우 프로그램의 갑작스러운 종료를 막고 정상 실행 상태를 유지할 수 있도록 처리하는 것
  • try-catch-finally 블록 : 생성자 내부와 메소드 내부에서 작성되는 예외 처리 코드
  • 다중 catch 블록 : 예외 별로 예외 처리 방식을 다르게 할 경우 여러 개의 catch 블록을 가질 수 있다.
  • throws 키워드 : 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할



© 2021. By Backtony