JAVA STUDY(with whiteship) 9주차 예외 처리

hwk·2021년 2월 14일
0

JAVA STUDY

목록 보기
9/12

목표

자바의 예외 처리에 대해 학습.

목차

  1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
  2. 자바가 제공하는 예외 계층 구조
  3. Exception과 Error의 차이는?
  4. RuntimeException과 RE가 아닌 것의 차이는?
  5. 커스텀한 예외 만드는 방법

1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

■ try~catch문

try {
// try 영역에서 발생한 AAA 예외상황은
}
catch {
// 이어서 등장하는 catch 영역에서 처리된다.
}

Try는 예외상황이 발생하는 상황의 영역을 감싸고 catch는 발생한 예외의처리를 위한 코드를 감싼다.
즉 위 코드의 해석은 "try 영역에서 발생한 AAA에 해당하는 예외상황은 이어서 등장하는 catch영역에서 처리된다" 라고 해석할 수 있다.

■ throw
throw문장을 통해 예외상황이 발생했음을 알린다.
하지만 이 throw문장에서 예외상황이 발생한 것은 아니다. 예외의 상황은 다른 영역에서 발생을 하고,
이 throw문장을 통해서 예외가 발생했음을 알리기만 한다.

■ throws
• throw에 의해 생성된 예외상황의 던져짐.
examMethod throws customException
"examMethod라는 메서드 내에서 예외상황을 처리하지 않으니,
이 메서드를 호출하는 영역에서 customException에 대한 처리도 대비해야 한다" 라는 선언이다.
같은 뜻으로써, "examMethod 내에서 customException의 예외 상황이 발생하면, examMethod를 호출 영역으로
넘겨버린다(던져버린다)" 라는 선언이기도 하다.

throw에 의해 생성된 예외상황이 메서드 내에서 처리되지 않는다면, 메서드를 호출한 영역으로 넘어감을(던져짐을) 반드시 명시해야 한다.

  • throw에 의해 생성된 예외상황은 반드시 try~catch문에 의해 처리되거나 throws에 의해서 넘겨져야 한다.
    throw 문장이 있는 메서드를 호출한 영역에서도 try~catch문에 의해 예외상황이 처리되어 있지 않는다면, 그 영역의 메서드 역시 throws에 의해서 넘겨져야 한다.
    throw에 의해 생성된 예외상황이 처리되어있지 않을 때,
    throw 문장이 있는 메서드를 호출한 영역에서까지 try~catch문으로 예외상황을 처리하지 않고 throws로 계속해서 연속적으로 넘겨서 메인메서드까지 도달한다면
    메인메서드에서도 throws를 선언해줘야하고, 이렇게되면 main 메서드를 호출한 영역으로 넘기는데,
    Main 메서드는 가상머신이 호출하는 메서드이기 때문에 가상머신이 예외상황 처리를 하게 된다.
    가상머신은 아래와 같이 예외상황을 처리한다.
    1. getMessage메서드를 호출
    2. 예외상황이 발생해서 전달되는 과정을 출력
    3. 프로그램 종료

■ finally
finally는 예외상황의 발생여부와 상관없이 항상 실행된다.

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


출처 : https://itmining.tistory.com/9

모든 예외 클래스는 Throwable 클래스를 상속한다. Exception 클래스를 상속하는 예외 클래스의 수만 해도 100개가 넘는다.

3. Exception과 Error의 차이는?

■ try~catch문과 throws절을 이용한 예외처리
Exception 클래스와 Error 클래스는 Throwable 클래스를 상속한다.
하지만 Error는 Throable과 달리 메모리 공간의 부족이나 JVM에 문제가 발생하는 등의 심각한 오류의 상황을 표현하기 위해 정의된 클래스이다. 이러한 상황에서는 try~catch문, 또는 throws절을 이용한 예외처리로 에러를 처리할 수 없고,
Error를 상속하는 클래스의 오류상황이 발생하면 프로그램이 종료된 뒤 소스코드를 수정하는 등의 방식으로
원인을 해결한다.

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

■ Error 클래스와 비슷한 성격인 RuntimeException 클래스
RE는 Exception의 하위 클래스이다.
하지만 다른 예외 클래스들과의 차이점은 성격이 Error클래스와 비슷하기 때문에
try~catch문, 또는 throws절을 이용한 예외처리를 필요로 하지 않는다.
하지만 다음과 같은 Error의 하위 클래스들과 구분되는 특징이 있다.
• RE를 상속하는 예외 클래스는 Error를 상속하는 예외 클래스처럼 치명적인 상황을 표현하지 않는다.
• 예외 발생 이후에도 프로그램의 실행을 이어가기 위해서 try~catch문으로 해당 예외를 처리하기도 한다.

RE의 하위클래스에는 다음과 같은 클래스가 있다.
• ArrayIndexOutOfBoundsException
배열의 접근에 잘못된 인덱스 값을 사용하는 예외상황
• ClassCastException
허용할 수 없는 형변환 연산을 진행하는 예외상황
• NegativeArraySizeException
배열선언 과정에서 배열의 크기를 음수로 지정하는 예외상황
• NullPointerException
null로 초기화 된 참조변수를 통해서 메서드를 호출하는 예외상황

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

■ Exception 클래스 상속
커스텀한 예외 클래스의 정의에 필요한 조건

  • Exception 클래스를 상속한다.
    Exception 클래스는 모든 예외 클래스가 상속한다는 Throwable 클래스의 하위 클래스이다.
    따라서 이를 상속함으로써 예외 클래스가 되어 try~catch 예외처리 메커니즘에 활용이 가능한 클래스가 된다.

■ 상위 클래스인 Exception 클래스의 생성자 호출, getMessage
Exception 클래스의 생성자 호출을 통해서 전달된 문자열이 getMessage의 호출을 통하여 반환된다.

# End

참고 서적 : 난 정말 JAVA를 공부한 적이 없어요 (ORANGE MEDIA 윤성우 저)

profile
Elegant Dev

0개의 댓글