예외처리

오류의 종류

오류 구문오류 치명적이지 않은 오류
논리오류 치명적인 오류(실행은 되나 원하는 값이 나오지 않는것)
예외 누군가만, 어떤 컴퓨터만, 어떤 상황에서만 예외 적으로 발생하는 오류

예외처리한다는 것이란?

  • 프로그램에서 데이터를 보낼 때 그것을 처리하는 애를 API라고 보자.
  • 그럼 API가 프로그램에서 필요한 부분을 처리하기 위해 처리하는 과정에서 자신이 처리 할 수 없는 데이터나 문제가 생기면 어떻게 된다는 것일까? 
  • API가 혼자서 처리할 수 있으면 좋겠지만 그것은 불가능하여 다시 프로그램에게 보고를 하기 위한 방식으로 처리 한다는 것이 예외처리이다. 
  • API가 프로그램에게 오류를 보내는 것을 공을 던진다하고 표현한다. 
  • 프로그램에서는 try catch 문을 이용하여 처리한다. 

예외처리 흐름

  • 먼저 클래스에서 흐름을 읽기 위한 코드를 작성하였다.

  • 위의 코드를 보면 메서드 자체를 static 메모리에 올려서 수를 받는 대로 계산을 할 수 있는 프로그램을 작성했는데, 거기서1000이상이 되는 수를 메서드가 받았을 때, 메서드는 천을_넘는_예외라고 공을 main에게 던졌다.
  • 그럼 메인은 catch구문에서 그러한 예외를 참조변수 e 로 변환하여 천을_넘는_예외 class에 있는 문자를 보여준다. 아래의 그림을 보고 정리를 해보자 

 


다중 예외처리

  • Calculation class에는 현재 2개의 예외처리 공을 던지게 해두었다.
  • 첫 번째는 천이 넘는수, 두 번째는 음수가 되는 수
  • 아래 코드를 보면 천이_넘는_예외는 catch 구문으로 잡아서 특화된 처리라고 메세지를 보낸다
  • 그러면 나머지 하나는 어디로 가는 것인가? 
  • 그것은 예외처리 최고조상 Exception으로 가게 된다. (음수는 자동적으로 음수 처리 메세지를 보여준다)
  • finally는 예외가 발생했을 때 무조건 거쳐가는 톨게이트라고 생각하면 쉽다. 
  • 최종적으로 예외가 발생하면 catch문에 있는 메세지 출력 >> finally에 있는 메세지 출력으로 마무리된다. 
public class Program {
	public static void main(String[] args) {
//		Calculator cal = new Calculator();
		int result = 0;
		try {
			result = Calculator.add(3, 4);
			System.out.printf("add : %d \n", result);
			result = Calculator.sub(3, 4);
		} catch (천을_넘는_예외 e) {
			System.out.println("특화된 처리");
		} catch (Exception e) {
			System.out.println("음수 처리");
		} finally {
			System.out.println("입력값에 오류가 있습니다.");

		}
		System.out.printf("sub : %d \n", result);
		result = Calculator.mul(3, 4);
		System.out.printf("mul : %d \n", result);
		result = Calculator.div(3, 4);
		System.out.printf("div : %d \n", result);
	}
}

Checked, Unchecked 예외

  • 예외처리를 할 필요 없는 것을 unchecked예외라고 한다. 
  • 강제하려고 하는 부분이 있다면 checked, 강조하지 않아도 된다고 보면 unchecked를 이용하면 된다.
  • checked >> uncecked로 변경하는 방법은 exception class에 가서 Runtime을 추가하면 된다. 

Checked
Unchecked