자바의 정석 챕터 8을 읽고 정리
개발하다가 '내가 예외처리를 제대로 하고 있는게 맞을까?' 생각이 들어서 책을 보게 됐다.(기초부터 다시 공부하기 위해)
1. 프로그램 오류
- 컴파일 에러: 컴파일 시 발생하는 에러
- 런타임 에러: 실행 시 발생하는 에러
- 논리적 에러: 실행은 되지만, 의도와 다르게 동작하는 것
- 에러: 코드에 의해서 수습될 수 없는 심각한 오류
- 예외: 코드에 의해서 수습될 수 있는 다소 미약한 오류
2. 예외 클래스의 계층구조
- 모든 예외의 최고 조상인 Exception 클래스
3. 예외처리하기 - try-catch
- 예외처리의 정의: 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
- 예외처리의 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
try {
// 예외가 발생할 가능성이 있는 코드
} catch(Exception e1) {
...
} catch(Exception e2) {
...
}
- 에러변수는 같으면 안된다.
4. try-catch의 흐름
- try 블럭 안에서 예외가 발생한 경우
(1) 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
(2) 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 코드를 실행하고, 전체 try-catch문을 빠져나가서 그 다음 코드를 실행한다. 만약, 일치하는 catach 블럭을 찾지 못하면, 예외 처리되지 못한다.
- try 블럭 안에서 예외가 발생하지 않은 경우
catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 코드를 진행한다.
5. 예외의 발생과 catch 블럭
printStackTrace()와 getMessage()
- 예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨 있다.
- printStackTrace(): 예외발생 당시의 호출스택에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.
- getMessage(): 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
6. 예외 발생시키기
- 연산자 new를 이용해서 발생시키려는 예외클래스의 객체를 만든다.
Exception e = new Exception("Error");
- 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
- 한 줄에 예외 발생시키기
throw new Exception("error");
7. 메소드에 예외 선언하기
void methd() throws Exception1, Exception2, ... {
// 메소드 내용...
}
8. finally 블럭
- 예외의 발생여부에 상관없이 실행되어야할 코드를 작성
try {
} catch (Exception e) {
} finally {
// 코드 작성...
}
9. 자동 자원 반환 - try-with-resources
try {
fis = new FileInputStream("score.dat");
dis = new DataInputStream(fis);
} catch (IOException ie) {
ie.printStackTrace();
} finally {
dis.close(); // 예외 발생하더라도 dis를 닫기 위해 finally블럭 사용
}
// 예외문 추가
try {
fis = new FileInputStream("score.dat");
dis = new DataInputStream(fis);
} catch (IOException ie) {
ie.printStackTrace();
} finally {
try {
if (dis != null) dis.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
- 이런 코드를 좀더 깔끔하게 구현하면
try (FileInputStream fis = new FileInputStream("score.dat");
DataInputStream dis = new DataInputStream(fis)) {
(...생략...)
} catch (EOFException e) {
...
} catch (IOException ie) {
...
}
- try ()안에 객체를 생성하는 문장을 넣으면, try 블럭을 벗어나는 순간 close()는 자동으로 수행된다.
'개발 > Java&Kotlin' 카테고리의 다른 글
[Spring] 스프링시큐리티 예제 (2) | 2022.08.29 |
---|---|
[JPA] LIKE 정리 (0) | 2022.08.24 |
[Spring] Message 적용해보기 (0) | 2022.08.21 |
[Spring] Validation 적용해보기 (0) | 2022.08.18 |
[Spring] 스웨거(Swagger) 라이브러리 (1) | 2022.08.17 |