[JAVA]예외 처리

박두팔이·2022년 11월 14일
0

오류(error)와 예외(exception)
예외의 정의: 실행시에 발생할 수 있는 모든 에러상황

  • 프로그램의 마무리를 짓기 위해 주로 사용
  • 자바 프로그램을 작성할 때 자바 문법에 맞지 않게 코드를 작성하고 컴파일하려고 하면, 자바 컴파일러는 문법 오류(syntax error)를 발생시킵니다.
  • 또한, 자바 문법에는 맞게 작성되었다 하더라도 프로그램이 실행되면서 예상하지 못한 오류가 발생할 수 있습니다.
  • 이렇게 컴퓨터 시스템이 동작하는 도중에 예상하지 못한 사태가 발생하여 실행 중인 프로그램이 영향을 받는 것을 오류(error)와 예외(exception) 두 가지로 구분할 수 있습니다.
  • 오류(error)는 시스템 레벨에서 프로그램에 심각한 문제를 야기하여 실행 중인 프로그램을 종료시킵니다.
  • 이러한 오류는 개발자가 미리 예측하여 처리할 수 없는 것이 대부분이므로, 오류에 대한 처리는 할 수 없습니다.
  • 하지만 예외(exception)는 오류와 마찬가지로 실행 중인 프로그램을 비정상적으로 종료시키지만, 발생할 수 있는 상황을 미리 예측하여 처리할 수 있습니다.
  • 따라서 개발자는 예외 처리(exception handling)를 통해 예외 상황을 처리할 수 있도록 코드의 흐름을 바꿀 필요가 있습니다.

예외 처리(exception handling)

  • 자바에서는 프로그램이 실행되는 도중 발생하는 예외를 처리하기 위해 try / catch / finally 문을 사용할 수 있습니다.
try {
    예외를 처리하길 원하는 실행 코드;
} catch (e1) {
	e1 예외가 발생할 경우에 실행될 코드;
} catch (e2) {
    e2 예외가 발생할 경우에 실행될 코드;
}

...
finally {
    예외 발생 여부와 상관없이 무조건 실행될 코드;
}
  • 자바에서는 예외라는 것을 두고 목적에 따라서 핸들링(처리)합니다.
  • 예외란 주로 실행시에 발생되는 모든 에러 상황으로 정의합니다.
  • 물론 특정 API는 컴파일시에 예외처리를 하지 않으면
  • 컴파일이 되지 않는 예외도 있습니다.
  • 예외의 정의 : 실행시에 발생할 수 있는 모든 에러상황
  • 자바에서는 예외가 발생되는 순서를 아래처럼 표현합니다.
  • 컴파일 → 실행 → 실행 중 예외 발생 → VM이 발생된 예외의 종류 및
  • 내용을 파악한 뒤에 예외 객체 생성 → 발생된 코드 밖으로
  • 예외 객체를 던짐(Throw) → 예외의 콜 스택에 전이 →
  • main 메소드 밖까지 던지게 되면 프로그램 비정상 종료
  • 위에서 보듯 예외는 던지다라고 표현합니다.
  • 또한 예외는 객체이기 때문에 당연히 클래스로 정의되어 있습니다.
  • 예외의 최고 클래스는 lang패키지의 Throwable입니다.
  • Error의 하위 타입은 일반적으로 Java실행기 즉 VM에 관련된
  • 에러 상황들을 정의한 클래스입니다.
  • 이러한 문제들은 프로그래머가 처리할 수 없는 것입니다.
  • → vm 즉 jre전체의 문제이기도 합니다.
  • 따라서 프로그래머는 Error의 하위 타입의 예외(에러)들은
  • 처리하지 않고 무시합니다.
  • Exception이라는 클래스의 하위 타입이 바로 프로그래머가
  • 처리해야 할 예외 타입입니다.
  • 따라서 보통 예외다 라고 표현할 때 최고 클래스로는 Exception
  • 클래스를 말합니다.
  • Throwable 클래스는 자식으로 Error를 가지고 있기 때문에
  • 예외 최고 클래스라고 하지 않습니다.

예외의 종류

  • 예외의 종류
  • 크게 두가지로 나뉠 수 있습니다.
  • 컴파일러가 관여하는 알려진 예외
  • 컴파일러가 관여하지 않는 알려지지 않는 예외
  • 구분하는 방법은 Exception하위 클래스 중 RuntimeException이
  • 있는데 해당 클래스의 자식 클래스는 모두 알려지지 않은
  • 예외입니다.
  • 나머지는 모두 알려진 예외입니다.

아래의 예시 참고

public static void main(String[] args) {
		int[] arr = new int[10];
		try {
			System.out.println(arr[10]);
			
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("index 밖으로 나갔습니다. ");
		}
		
		
		int num = 10;
		int num2 = 0;
		try {
			System.out.println(num/num2);			
			
		} catch (ArithmeticException e) {
			e.printStackTrace(); // 어떤 오류때문에 문제가 발생했는지 알려줌 
			System.out.println("0으로 나눌 수 없습니다. ");
		}
		System.out.println("프로그램 끝");
	}

profile
기억을 위한 기록 :>

0개의 댓글