1. 예외처리
1.1 프로그램 오류
- 컴파일 에러 : 컴파일 시에 발생하는 에러
- 런타임 에러 : 실행 시 발생하는 에러
- 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것
** 런타임시 발생할 수 있는 프로그램 오류
에러 : 메모리 부족이나 스택오버플로우와 같이 발생하면 복구할 수 없는 심각한 오류
예외 : 발생하더라도 수습될 수 있는 오류
1.2 예외 클래스의 계층구조
모든 예외의 최고 조상은 Exception클래스,
Exception 하위에서 가장 많은 자손 클래스를 가지고 있는 예외는 RuntimeException클래스
- Exception클래스들 : 사용자의 실수와 같은 외적 요인에 의해 발생하는 예외
- RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외
1.3 예외처리하기 try-catch문
- 정의 : 프로그램 실행 시 발생할수 있는 예외에 대비한 코드를 작성하는 것
- 목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
try{
// 예외가능성이 있는 문장들
}catch(Exception1 e1){
// exception1 발생시 처리하기 위한 문장
}catch(Exception2 e2){
// exception2 발생시 처리하기 위한 문장
}
** catch문은 여러 예외의 종류별로 구분할 수 있다.
발생한 예외 종류와 일치하는 catch블럭이 없으면 예외처리는 되지 않는다.
** try-catch 안에 try-catch문이 사용 될수 있다. (catch문 안에서도 예외가 발생될 수 있기 때문에)
1.4 try-catch문에서의 흐름
- try 블럭 내에서 예외가 발생한 경우
1) 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
2) 일치하는 catch블럭을 찾게 되면 그 catch블럭의 문장들을 수행하고 전체 try-catch문을 빠져나가서
다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭이 없다면 예외는 처리되지 못한다.
- try 블럭 내에서 예외가 발생하지 않은 경우
1) catch블럭을 거치지 않고 전체 try-catch문을 빠져나가 계속 수행된다.
1.5 예외의 발생과 catch블럭
- 예외가 발생되면 생성된 예외클래스의 인스턴스에 instanceof 연산자를 통해 catch블럭의 괄호안에 선언된 참조변수의 예외 클래스와 타입이 같은지 true가 나올때까지 확인한다. (일치하는 catch 블럭이 없으면 예외처리되지 않는다)
- Exception클래스는 모든 예외의 부모클래스이므로 따로 세분화하여 catch블럭을 선언하지 않아도 Exception클래스의 참조변수를 가진 catch블럭이 있으면 모든 예외는 처리된다.
** printStackTrace() 와 getMessage()
- printStackTrace() : 예외 발생 당시 호출스택(call Stack)에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.
- getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
* 멀티 catch블럭
- 여러 catch블럭을 | 를 사용하여 하나의 catch블럭으로 합칠수 있다. (갯수 제한 없음)
catch( ExceptionA | ExceptionB e){
e.printStackTrace()
}
- 연결된 예외클래스가 상속관계에 있다면 컴파일 에러가 발생한다.
1.6 예외 발생시키기
1. 연산자 new 를 이용하여 발생시키려는 예외 클래스의 객체를 많든다.
Exception e = new Exception("예외 객체 생성");
2. 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
** 컴파일러가 예외처리를 확잉ㄴ하지 않는 RuntimeException 클래스들은 'unchecked 예외',
예외처리를 확인하는 Exception 클래스들은 'checked예외'라 한다.
1.7 메서드에 예외 선언하기
- 메소드 선언부에 키워드 throws를 사용해서 메소드 내에서 발생할수 있는 예외를 적어주면 된다.
1.8 finally블럭
- try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다.
(선택사항)
- try-catch 블럭 중 return을 만나도 finally블럭이 우선 실행된다.
1.9 자동 자원 반환 - try-with-resources문
- 입출력과 관련된 클래스를 사용할 때 유용하다. (try문을 벗어나면 자동으로 .close() 호출한다.
try(FileInputStream fis = new FileInputStream("score.dat")){ } 의 형태를 지닌다.
1.10 사용자정의 예외 만들기
- Exception 또는 RuntimeException을 상속받아 만들수 있다.
1.11 예외 되던지기 (exception re-throwing)
- 예외를 처리한 후 인위적으로 다시 발생시키는 방법
1.12 연결된 예외 (chained exception)
- 한 예외가 다른 예외를 발생시킬수도 있다. 다른 예외를 발생시킨 예외를 원인예외라 한다.
- 상속관계의 예외의 경우 정확한 원인을 알수 없는데 반해 원인예외를 알수 있다.
- checked 예외를 unchecked 예외로 변환할수 있다.
'Programming > Java \ Spring' 카테고리의 다른 글
🔥자바스터디🔥 자바의 정석 CH10 날짜와 시간 형식화 (0) | 2021.06.27 |
---|---|
🔥자바스터디🔥 자바의 정석 CH9 java.lang패키지와 유용한 클래스 (1) | 2021.06.20 |
🔥자바스터디🔥 객체지향 개념을 살려서 스터디관리 프로그램 만들기 (0) | 2021.06.13 |
🔥자바스터디🔥 자바의 정석 CH7 객체지향 프로그래밍(상속, 오버라이딩, 제어자, 다형성, 추상클래스, 인터페이스, 내부클래스) (0) | 2021.06.03 |
🔥자바스터디🔥 배열과 반복문을 이용한 BINGO 만들기 (0) | 2021.05.30 |