[Java] 예외처리

✨New Wisdom✨·2020년 12월 5일
1

📕 Java 📕

목록 보기
3/24
post-thumbnail

이 노트는 "윤성우의 열혈 java 프로그래밍" 책을 공부하면서
내가 이해한대로 다시 정리하면서 작성되었다.

자바 예외처리의 기본

try-catch

try{
	// 관찰 영역 
} catch (Exception name) {
	// 처리 영역
}
  • try 영역에서 발생한 예외 상황을 catch 영역에서 처리한다.
  • catch 는 메소드처럼 동작한다.

자바는 예외 상황별로 그 상황을 알리기 위한 클래스를 정의하고 있다.
이러한 클래스를 가리켜 '예외 클래스'라고 한다.
만약 수학 연산 관련 오류가 발생하면 가상머신은 예외 클래스 AriyhmrticException의 인스턴스를 생성하고,
이 인스턴스를 프로그래머가 처리하면 예외는 처리된 것으로 간주하여 프로그램을 종료하지 않는다.

둘 이상의 예외를 처리하기 위한 구성

두 가지 예외 상황에 대한 처리를 하고 싶다면 catch 구문들을 이어서 구성하면 된다.

...
try {
	System.out.print("a/b...a?");
    int n1 = kb.nextInt();
    System.out.print("a/b...b?");
    int n2 = kb.nextInt();
    System.out.printf("%d / %d = %d \n", n1, n2, n1/n2);
} catch (ArithmeticRxception | InputMismatchException e) {
	e.getMessage();
}

상황별 예외의 처리 방식이 다르지 않을 경우, 위와 같이 하나의 catch 구문 안에서 모든 예외가 처리될 수 있도록 묶어주는 것도 방법이다.

Throwable 클래스

자바의 최상위 클래스인 java.lang.Object를 제외하고 예외 클래스의 최상위 클래스는 java.lang.Throwable이다.
이 클래스의 getMessage() 메소드는 예외의 원인을 담고 있는 문자열을 반환하며, printStackTrace()는 예외가 발생한 위치와 호출된 메소드의 정보를 출력한다.

Throwable 클래스를 상속하는 3가지 클래스

  • Error 클래스를 상속하는 예외 클래스
  • Exception 클래스를 상속하는 예외 클래스
  • RuntimeExcception 클래스를 상속하는 예외 클래스
    RuntimeException 클래스는 Exception 클래스를 상속한다.

프로그래머가 정의하는 예외

프로그래머는 Exception 클래스를 상속하여 예외 클래스를 정의할 수 있다.

import java.util.Scanner;

class ReadAgeException extends Exception {
    public ReadAgeException() {
        super("유효하지 않은 나이가 입력되었습니다.");
    }
}

class MyExceptionCalss {
    public static void main(String[] args) {
        System.out.print("나이 입력 : ");

        try {
            int age = readAge();
            System.out.printf("입력된 아니 : %d \n", age);
        } catch (ReadAgeException e) {
            System.out.println(e.getMessage());
        }


        public static int readAge() throw ReadAgeException {
            Scanner kb = new Scanner(System.in);
            if (age < 0) {
                throw new ReadAgeException();
            }
            return age;
        }
    }
}  

음수를 입력받았을 때 예외로 처리하기 위해 예외 클래스를 직접 정의하였다.
예외 클래스의 인스턴스를 생성하고 이를 대상으로 throw 선언을 하면 예외가 발생이 된다.
이 과정을 인스턴스 생성과 예외의 발생을 구분한다면 다음과 같다.

throw (new ReadAgeException());

finally

finally 구문을 두면 코드의 실행이 try 안으로 진입할 때 무조건 실행이 된다.

try {
	...
} catch(Exception name) {
	...
} finally {
	... // try 안으로 진입하면 무조건 실행
}

try 에서 예외가 발생하건 안하건, catch 강 실행되건 안되건 무조건 실행된다.

try-with-resource 구문

finally 구문 안에서 try-catch를 처리하는 문제를 해결하기 위해 나온 방안이다.

try(resource) { // 종료 과정을 필요로 하는 리소스 생성 가능
} catch(Exception name) {
}
profile
🚛 블로그 이사합니다 https://newwisdom.tistory.com/

0개의 댓글