티스토리 뷰
반응형
[Java의 정석 - http://www.yes24.com/Product/Goods/24259565]
1. 예외처리(exception handling)
1.1 프로그램 오류
- 컴파일 에러(compile-time error) : 컴파일 시에 발생하는 에러
- 런타임 에러(runtime error) : 실행시에 발생하는 에러
- 논리적 에러(logical error) : 실행은 되지만 의도와 다르게 동작하는 것
- 에러(error)
- 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 발생하면 복구할 수 없는 심각한 오류
- 발생하면 프로그램의 비정상적인 종료를 막을 수 없음
- 예외(exception)
- 발생하더라도 수습될 수 있는 비교적 덜 심각한 오류
- 발생하더라도 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있음
1.2 예외 클래스의 계층구조
- 예외 클래스들은 두 그룹으로 나눌 수 있음
- Exception class와 그 자손들(RuntimeException과 자손들 제외)
- 주로 외부의 영향으로 발생할 수 있는 것들
- 프로그램 사용자들의 동작에 의해서 발생하는 경우가 많음
- 종류
- FileNotFoundException
- ClassNotFoundException
- DataFormatException
- RuntimeException 클래스와 그 자손들
- 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들로 주로 자바의 프로그래밍 요소들과 관계가 깊음
- 종류
- ArrayIndexOutOfBoundException
- NullPointerException
- ClassCastException
- ArithmeticException
- Exception class와 그 자손들(RuntimeException과 자손들 제외)
1.3 예외처리하기 - try-catch문
- 예외처리(exception handling)
- 정의 : 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
- 목적 : 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다
} catch (Exceptione1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다
} catch (Exceptione2) {
// Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 적는다
} catch (Exceptione3) {
// Exception3이 발생했을 경우, 이를 처리하기 위한 문장을 적는다
}
- try-catch 문
- 발생한 예외의 종류와 일치하는 단 한개의 catch 블럭만 수행되며 발생한 예외의 종류와 일치하는 catch 블럭이 없으면 예외는 처리되지 않는다
- catch 블럭의 괄호 내에 선언된 변수는 catch 블럭 내에서만 유효하다
1.4 try-catch문에서의 흐름
- try 블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다
- 일치하는 catch 블럭을 찾게 되면 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch 문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch 블럭을 찾지 못하면 예외는 처리되지 못한다
- try 블럭 내에서 예외가 발생하지 않은 경우
- catch 블럭을 거치지 않고 전체 try-catch
- try 블럭에서 예외가 발생하면 예외가 발생한 위치 이후에 있는 try 블럭의 문장들은 수행되지 않으므로 try 블럭에 포함시킬 코드의 범위를 잘 선택해야 한다
1.5 예외의 발생과 catch 블럭
- catch 블럭의 괄호 내에는 처리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다
- try 블럭에서 예외가 발생하면 catch 블럭을 차례대로 내려가면서 catch 블럭의 괄호 내에 선언된 참조변수와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 이용해서 검사한다
- 검사 결과가 true인 catch 블럭을 만날 때까지 검사는 계속된다
- 모든 예외 클래스는 Exception 클래스의 자손이므로 catch 블럭의 괄호에 Exception을 선언해놓으면 모든 종류의 예외를 처리할 수 있다
- try 블럭에서 예외가 발생하면 catch 블럭을 차례대로 내려가면서 catch 블럭의 괄호 내에 선언된 참조변수와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 이용해서 검사한다
- printStackTrace()와 getMessage()
- printStackTrace()
- 예외 발생 당시의 호출스택(call stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다
- getMessage()
- 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다
- printStackTrace()
- 멀티 catch 블럭
- catch(ExceptioneA e1) { } catch(ExceptionB e2) { } => catch(ExceptionA || ExceptionB e) { }
- '|' 기호로 연결된 예외 클래스가 조상과 자손의 관계에 있다면 컴파일 에러가 발생한다
- 그냥 조상 클래스만 쓰는거랑 똑같아서
- '|'기호로 연결된 예외 클래스들의 공통 분모인 조상 예외 클래스에 선언된 멤버만 사용할 수 있다
1.6 예외 발생시키기
Exception e = new Exception("에러"); // 연산자 new를 사용해서 발생시키려는 예외 클래스의 객체를 만든 다음
throw e; // 키워드 throw를 이용해서 예외를 발생시킨다
- checked 예외
- Exception 클래스와 그 자손 클래스 예외가 발생할 가능성이 있는 문장들에 대해 예외처리를 해주지 않으면 컴파일조차 되지 않는다
- unchecked 예외
- RuntimeException 클래스와 그 자손 클래스 예외는 프로그래머에 의해 실수로 발생하는 것들이기 때문에 예외처리를 강제하지 않는다
1.7 메서드에 예외 선언하기
- 메서드의 선언부에 키워드 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 적어준다
- 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것
- 메서드의 선언부에 메서드에서 발생할 수 있는 예외를 명시함으로써 메서드를 사용하는 쪽에 이에 대한 처리를 강요하기 때문에 견고한 프로그램 코드를 작성할 수 있도록 도와준다
- 메서드에 예외를 선언할 때 일반적으로 RuntimeException클래스들은 적지 않는다
- 보통 반드시 처리해주어야 하는 예외들만 선언한다
1.8 finally 블럭
- finally 블럭 : 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용됨
- try-catch 문의 끝에 선택적으로 덧붙여 사용할 수 있음
- try-catch-finally 순서로 구성
- 예외 발생 : try -> catch -> finally 순으로 실행
- 예외 발생하지 않음 : try -> finally 순으로 실행
- try 블럭이나 catch 블럭에서 중간에 return 문을 만나도 finally 블럭이 실행된 후에 메서드가 종료된다
1.9 자동 자원 반환 - try-with-resources 문
- 입출력에 사용되는 클래스 중 사용한 후에 꼭 닫아줘야하는 것들이 있음(자원(resources) 반환 때문)
- ty-catch에서 finally에서 close()를 실행해도 거기서 예외를 발생할 수 있기 때문에 try-with-resources 문 사용
- try 괄호 안에 객체를 생성하는 문장을 넣으면 이 객체는 따로 close()를 호출하지 않아도 try 블럭을 벗어나는 순간 자동적으로 close()가 호출됨
1.10 사용자정의 예외 만들기
- Exception 클래스나 RuntimeException 클래스나 다른 예외 클래스로부터 상속받아 새로운 예외 클래스를 만들 수 있다
- String을 매개변수로 받는 생성자를 추가해 메시지 저장하는 에외 클래스를 만들 수 있다
- RuntimeException 클래스를 상속받아 예외처리를 선택적으로 할 수 있도록하는게 추세(uncheked 예외를 더 선호)
1.11 예외 되던지기(exception re-throwing)
- 예외 되던지기(exception re-throwing)
- 메서드에서 발생한 예외를 메서드 내에서 try-catch 문으로 처리할 수도 있고 메서드 선언부에 지정하여 호출한 메서드에서 처리할 수도 있다
- 예외가 발생할 가능성이 있는 메서드에서 try-catch 문을 사용해서 예외를 처리해주고 catch 문에서 필요한 작업을 핸한 후에 throw 문을 사용해서 예외를 다시 발생시킨다
- 다시 발생한 예외는 이 메서드를 호출한 메서드에게 전달되고 호출한 메서드의 try-catch 문에서 예외를 또다시 처리한다
- 예외가 발생한 메서드와 이를 호출한 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을 때 사용
1.12 연결된 예외(chained exception)
- 한 예외가 다른 예외를 발생시킬 수도 있음
- Throwable initCause(Throwable cause) :지정한 예외를 원인 예외로 등록
- Throwable getCuase() : 원인 예외를 반환
- 사용하는 이유
- 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해
- checked 예외를 unchekced 예외로 바꿀 수 있도록 하기 위해
반응형
'study > 자바의정석' 카테고리의 다른 글
Chapter14. 람다와 스트림 (0) | 2021.08.21 |
---|---|
Chapter.15 입출력 I/O (0) | 2021.06.13 |
Chapter12. 지네릭스, 열거형, 애너테이션 (0) | 2021.06.06 |
Chapter11. 컬렉션 프레임웍(Collections Framework) (0) | 2021.06.02 |
Chapter09. java.lang 패키지와 유용한 클래스 (0) | 2021.05.22 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스프링부트
- linuxkit
- 자바
- Spring
- gasmask
- docker pull limit
- 쿠버네티스
- 코틀린
- java
- back merge
- cacheable
- IntelliJ
- QuickTimePlayer
- kotlin
- 스프링
- docker
- 도메인주도설계
- 클린코드
- 자바스크립트
- k8s
- Kubernetes
- docker for mac
- 도커
- kotlin In Action
- gradle
- ImagePullBackOff
- clean code
- ddd
- JavaScript
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함