[JAVA 스터디] 9주차 : 예외처리
학습할 것
- 자바에서 예외 처리 방법(try, catch, throw, throws, finally)
- 자바가 제공하는 예외 계층 구조
- Exception과 Error의 차이는?
- RuntimeException과 RE가 아닌 것의 차이는?
- 커스텀한 예외 만드는 방법
먼저 알고가기
자바의 에러
- 컴파일 에러
- 컴파일 과정에서 일어나는 에러- 자바 컴파일러가 문법 검사를 통해 오류를 잡아준다.
- 런타임 에러
- 실행 과정에서 일어나는 에러- 자바는 런타임 에러를 예외(Exception)과 에러(Error) 두 가지로 구분하여 대응하고 있다.
예외와 에러
- 예외
- 발생 시의 코드를 미리 정의함으로써 프로그래머가 이를 핸들링 할 수 있다. - 에러
- 메모리 부족(OutOfMemoryError), 스택오버플로우(StackOverFlowError)처럼 JVM이나 하드웨어 등의 기반 시스템의 문제로 발생하는 것- 프로그래머가 이를 대비하여 핸들링 할 수 없기 때문에 애초에 발생하지 않도록 해야 한다.
예외 처리란?
- 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 코드를 통해 처리하는 것
1. 자바의 예외 처리 방법, 기법(try, catch, throw, throws, finally)
1) try - catch
<try-catch>문의 기본 구조
try {
...
} catch (예외1) {
...
} catch (예외2) {
....
} finally {
System.out.println("이건 반드시 실행되어야 합니다.");
}
- try문 안의 수행할 문장들에서 예외가 발생하지 않을 경우 catch문 다음의 문장들은 수행되지 않는다.
- try문 안의 문장들을 수행 중 해당 예외가 발생하면 예외에 해당되는 catch문이 수행된다.
2) finally
- try - catch과 함께 쓰이고 어떤 예외가 발생되더라도 반드시 실행되어야 하는 부분이 있을 때 사용할 수 있는 블록
- 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우 사용한다.
3) throw
- 프로그래머가 고의로 예외를 발생시키고자 할 때 사용할 수 있는 키워드
<throw 사용 예시>
if () {
throw new IllegalArgumentException("부적절한 이름입니다.");
// throw new IllegalArgumentException 구문을 풀어 쓴 경우
// IllegalArgumentException e = new IllegalArgumentException("부적절한 이름입니다.");
// throw e;
}
4) throws
- 메서드에 예외를 선언하고자 할 때 사용할 수 있는 키워드
- 메서드의 선언부에 예외를 선언해둠으로써 메서드를 사용하는 사람이 해야하는 예외 처리가 어떤 것이 있는 지에 대해 정보를 제공하고 예외 처리를 '위쪽으로 미루어 처리'한다.
- 해당 메서드를 사용할 경우 사용하는 쪽에서 반드시 throws 되어 있는 예외들을 처리해주어야 한다.
<throws 사용 예시>
// 메소드 호출
public static void main(String[] args) {
SayHello sayHello = new SayHello();
try {
sayHello.sayHello();
} catch (Exception1 e) {
System.out.println("예외가 발생하였습니다");
}
}
// 메소드 선언
public static void sayHello() throws Exception1, Exception2..ExceptionN {
//....
}
2. 자바가 제공하는 예외 계층 구조
Throwable 클래스
- 모든 예외와 에러 클래스들의 조상이 되는 클래스
- 예외나 에러에 대한 정보를 확인할 수 있는 메소드를 가진다.
- getMessage() : 해당 throwable 객체에 대한 자세한 내용을 반환
- printStackTrace() : 예외나 에러가 발생 할 때까지의 이력을 출력
- toString() : 해당 throwable 객체의 간단한 내용을 반환
3. Exception과 Error의 차이
Exception
- 프로그램 실행중 발생한다.
- 프로그래머가 예외를 처리하는 코드를 작성함으로써 방지가 가능하다.
- 프로그램에서 복구할 수 있는 장애를 말한다.
Error
- 실행 시 어떠한 원인에 의해 비정상적인 상황이 생겼거나 오작동, 종료되는 경우
- 프로그램에서 복구할 수 없는 심각한 장애를 말한다.
- 보통의 JVM이나 기타 하드웨어 등의 시스템 문제로 발생한다.
- Error가 발생하면 프로그램이 비정상적으로 종료된다.
- OutofMemory, StackOverFlow, ThreadDeath등이 있다.
- 런타임 시 발생하며 예측이 불가능한 Unchecked Error에 속한다. 코드를 수정하지 않고서는 문제를 해결할 수 없다.
4. RuntimeException과 RE가 아닌 것의 차이
- Java의 Exception 클래스는 RuntimeException과 이를 상속하는 클래스들은 Unchecked Exception으로, 그 외 Exception 클래스의 자식 클래스들은 Checked Exception으로 분류할 수 있다.
- 둘의 차이는 아래 표의 내용과 같다.
Unchecked Exception
- RuntimeException을 상속하는 예외들을 말한다.
- 명시적으로 예외처리를 강제하지 않는다.
- 프로그램에 오류가 있을 때 발생하도록 의도되었다.
Checked Exception
- RuntimeException을 상속하지 않는 예외들을 말한다.
- try - catch문을 사용하거나 throws로 예외를 자신을 호출한 클래스로 던지는 방법으로 반드시 예외를 처리해주어야 한다.
- 그렇지 않으면 컴파일 시점에 에러가 발생한다.
5. 커스텀한 예외 만드는 방법
- 최상위 클래스인 Exception을 상속받아(extends) Checked Exception을 구현한다.
- RuntimeException을 상속받아 Unchecked Exception을 구현한다.
Checked Exception 예시
/*
* 이것은 커스텀 CheckedException 입니다.
* 자바의 기본 예외로 표현할 수 없는 예외를 제공하기 위해 만들어졌습니다.
* */
public class CustomCheckedExceptionEx extends Exception {
public CustomCheckedExceptionEx() {
}
public CustomCheckedExceptionEx(String message) {
super(message);
}
public CustomCheckedExceptionEx(String message, Throwable cause) {
super(message, cause);
}
public CustomCheckedExceptionEx(Throwable cause) {
super(cause);
}
public CustomCheckedExceptionEx(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
class CustomCheckedExceptionTest {
public static void main(String[] args) throws CustomCheckedExceptionEx {
try {
// doSomething
} catch (Exception e) {
throw new CustomCheckedExceptionEx("커스텀 체크드 예외 발생!!", e);
}
}
}
Unchecked Exception 예시
public class CustomUncheckedException extends RuntimeException {
public CustomUncheckedException() {
}
public CustomUncheckedException(String message) {
super(message);
}
public CustomUncheckedException(String message, Throwable cause) {
super(message, cause);
}
public CustomUncheckedException(Throwable cause) {
super(cause);
}
public CustomUncheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
class CustomUncheckedExceptionTest {
public static void main(String[] args) {
try {
// doSomething
} catch (RuntimeException e) {
throw new CustomUncheckedException("커스텀 언체크드 예외 발생!!", e);
}
}
}
[참고]
https://parkadd.tistory.com/69
https://zannew.tistory.com/23
https://velog.io/@zayson/%EB%B0%B1%EA%B8%B0%EC%84%A0%EB%8B%98%EA%B3%BC-%ED%95%A8%EA%BB%98%ED%95%98%EB%8A%94-Live-Study-9%EC%A3%BC%EC%B0%A8-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC
https://youn12.tistory.com/32
Author And Source
이 문제에 관하여([JAVA 스터디] 9주차 : 예외처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@codename_hee/JAVA-스터디-9주차-예외처리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)