✏️ Info.
- Excetpion 과 Error 학습
📋 List.
1. Exception과 Error의 차이는?
2. 자바가 제공하는 예외 계층 구조
3. RuntimeException과 RE가 아닌 것의 차이는?
4. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
5. 커스텀한 예외 만드는 방법
✔️ Content.
1. Exception과 Error의 차이는?
Error
- 시스템의 비정상적인 상황이 생겼을 때 발생
- 프로그램에서 복구할 수 없는 심각한 장애
- 보통의 JVM 기타 하드웨어 등의 시스템 문제로 발생
- Error 발생시 프로그램은 비정상적으로 종료된다.
- ex) OutOfMemory, StackOverFlow , ThreadDeath 등
Exception
- 보통 프로그램 실행중 발생
- 프로그램에서 복구할 수 있는 장애
2. 자바가 제공하는 예외 계층 구조
* Error, Exception 모두 Throwable을 상속하고 있다.
3. RuntimeException과 RE가 아닌 것의 차이는?
* 위의 자바가 제공하는 예외 계층 구조를 참고해서 설명하면 다음과 같다
Checked Exception | Unchecked Exception | |
구분 | RuntimeException를 상속하지 않은 클래스 | RuntimException을 상속한 클래스 |
예외 처리 | 반드시 예외 처리 | 명시적으로 예외처리 하지 않아도 된다. |
확인 시점 | 컴파일(Compile) 시점 | 런타임(Runtime) 시점 |
트랜잭션 처리 | 예외 발생시 롤백(rollback)하지 않음 | 예외 발생시 롤백(rollback) |
발생 원인 | 프로그램 외부 | 프로그램 내부 |
설명 | 프로그램의 제어 밖에서 발생하는 오류 | 프로그램이 실행될 때 , 내부 코드에서 사용 방법이 잘 못 됐을 때 발생 |
예 | FileNotFoundException -> 파일(외부)이 존재 하지 않는다 | ArithmeticException-> 4/0(0으로 나눌경우) (내부) |
4. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
설명 | |
try | 실행 코드 영역 |
catch | try 에서 Excpetion 발생 시 처리 코드 영역 |
throw | 강제로 예외를 발생 시키는 키워드 |
throws | 메소드에 선언해주면 선언한 메소드를 호출한 메소드에게 예외가 전달된다. |
finally | try - catch 문에서 예외가 발생하여도 반드시 마지막에 호출되는 영역 |
기본 try - catch
void Exception(){
try {
// 입력 코드
}catch (Exception1 exception1){
// Exception1 처리 코드
}catch (Exception2 exception2){
// Exception2 처리 코드
}
}
multi catch
- Java 7 이상 사용 가능
- 다수의 Exception 하나의 로직으로 처리하기 위해 사용된다.
- 주의점
- multi catch로 묶인 Exception 들은 부모-자식 관계에 있으면 안 된다.
- multi catch 영역에서는 어떠한 Exception인지 알 수 없으므로 Excpetion을 공통 조상 클래스 정보가 담긴다.
void mulityException(){
try {
// 입력 코드
}catch (ArithmeticException | IllegalArgumentException | IndexOutOfBoundsException exception ){
// ArithmeticException, IllegalArgumentException, IndexOutOfBoundsException 처리 코드
}
}
finally
- finally는 try-catch 과정에서 어떤 예외 상황이 발생해도 반드시 실행되는 영역이다
void finallyException(){
try {
// 입력 코드
}catch (Exception e){
// Exception 처리 코드
}finally {
// 반드시 실행되는 코드 영역
}
}
try - with - resources
- Java 7 이상 사용 가능
- AutoCloseable이라는 Interface를 구현한 클래스에 한해 try에 선언된 클래스의 close()를 자동으로 호출해준다.
- 필요시에는 AutoCloseable을 구현하여 사용 가능
- 비교 예
- compareFinallyResourceExcpetion : try - catch - finally를 이용한 resources 사용 로직
- resourceException() : try - with - resources를 이용한 resources 사용 로직
사용 전
void compareFinallyResourceException(){
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
사용 후
void resourceException(){
try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));) {
} catch (Exception e) {
e.printStackTrace();
}
}
throw
- 명시적으로 예외를 만들어 낼 때 사용되는 키워드
void throwException(){
try {
int a = 4/0;
}catch (Exception e){
try {
throw new Exception("int a = 4/0");
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
throws
- Exception에 대한 처리를 호출 메소드에게 위임하기 위해 사용되는 키워드
- 여러 Exception을 동시에 선언할 수 있다.
void throwsException() throws IllegalArgumentException, FileNotFoundException, ArithmeticException {
try {
int a = 4/0;
}catch (Exception e){
throw new IllegalArgumentException("int a = 4/0");
}
}
5. 커스텀한 예외 만드는 방법
* Exception를 extends 받아 사용한다.
- Checked Exception 을 구현하기 위해서는 Exception 클래스를 상속받는다
- Unchekced Exception을 구현하기 위해서는 RuntimeException 클래스를 상속받는다.
public class customException extends Exception{
}
Custom Exception 사용
void customExceoption(){
try {
throw new customException();
} catch (customException e) {
e.printStackTrace();
}
}
❗️ Refer.
- Exception과 Error의 차이는?
https://github.com/ByungJun25/study/tree/main/java/whiteship-study/9week#try-catch
https://madplay.github.io/post/java-checked-unchecked-exceptions
- 자바가 제공하는 예외 계층 구조
https://madplay.github.io/post/java-checked-unchecked-exceptions
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
https://dololak.tistory.com/61
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
'Live-Study' 카테고리의 다른 글
[11주차] Enum (0) | 2021.02.19 |
---|---|
[10주차] 멀티쓰레드 프로그래밍 (0) | 2021.02.19 |
[8주차] 인터페이스 (0) | 2021.02.19 |
[7주차] 패키지 (0) | 2021.02.19 |
[6주차] 상속 (0) | 2021.02.19 |