<예외 처리> - try-catch
예외 처리란?
정의 : 프로그램 실행 시 발생할 수 있는 예외 발생 대비 코드 작성
목적 : 프로그램의 비정상 종료를 막고, 정상 실행 상태를 유지시키기 위해
처리 못 한 예외는 JVM의 예외 처리기가 받아서 예외 원인 화면 출력해줘요!
try {
//예외 발생 가능성 있는 문장들
} catch(ExceptionA ea) {
//ExceptionA라면 이렇게 처리
} catch(ExceptionB eb) {
//ExceptionB라면 이렇게 처리
}
하나의 try 블럭 다음에는 여러 종류의 예외 처리가 가능하도록
1개 이상의 catch블럭 사용(제한 없음)
이 중, 발생한 예외 종류와 일치하는
단 한 개의 catch블럭만 수행하고
try-catch문을 빠져나옴
ㄴ 만약 catch에 해당하는 예외가 없다면?
예외 처리 안되고 프로그램 종료됨
{ } 괄호는 절대 생략 불가
- try 블럭 내에서 예외 발생한 경우
1. 발생한 예외와 일치하는 catch블럭이 있는가?
2. 일치하는 catch블럭이 있다면, 그 catch블럭 내의 문장 수행하고
전체 try-catch 블럭 빠져나가서 다음 문장들 수행
ㄴ 없다면? 예외 처리 불가
- try 블럭 내에서 예외 발생 안 하면
1. catch블럭을 거치지 않고, try-catch문을 빠져나가서 수행(try만 수행)
<예외의 발생과 catch블럭>
catch블럭의 ( ) 괄호 안에는
처리하고자 하는 예외와 같은 타입의 참조변수 선언
예- (ArithmeticExcepton ae) -> ae가 참조변수
예외가 발생하면
1. 발생한 예외에 해당하는 클래스의 인스턴스 생성됨
2. 예외 발생 문장이 try 블럭 내에 있으면, 예외 처리 가능한 catch가 있는지 확인
ㄴ 첫 번째 catch블럭부터 내려가며,
참조변수에게 생성 된 예외 클래스의 인스턴스를 넣고
instanceof 연산자로 검사함
true면 catch실행 후 빠져나가고, false면 예외 처리 X
- 모든 예외 클래스의 최고 조상은 Exception 이라서
catch(Exception e)는, 모든 종류의 예외 처리 가능
<printStackTrace() 와 getMessage() > 예외의 메소드
예외 클래스의 인스턴스에는, 발생 예외 정보가 담겨 있음
catch블럭 괄호 안의 참조변수를 통해, 예외 인스턴스에 접근 가능
printStackTrace() - 무슨 예외가 생겼음?
예외 발생 당시, 호출 스택에 있었던 메소드의 정보와 예외 메시지 화면 출력
getMessage() - 뭐땜에 생김?
발생한 예외 클래스에 인스턴스에 저장된 메시지 읽기
ㄴ 예외 발생 원인을 알 수 있다
<멀티 catch블럭> - 중복 코드 줄이기
여러 catch블럭을 " | " 기호를 이용해, 하나의 catch블럭으로 합치는 것
try { } catch(ExceptionA ea) { ea.printStackTrace(); } catch(ExceptionB eb) { eb.printStackTrace(); }
ㄴ 종류는 다르지만 같은 조상의 메소드를 씀(처리 방법이 동일함) 이 땐?
try { } catch(ExceptionA | ExceptionB e) { e.printStackTrace(); }
ㄴ이렇게 멀티 catch블럭 사용 가능
단, 연결 된 예외가 조상-자손 관계라면 컴파일 에러
catch(ParentException | ChildException e) <- 에러
catch(ParentException e) <-이거랑 의미가 동일
ㄴ 형변환이 가능하니, 부모 참조 변수로 자식 인스턴스 받아도 되잖아!!
만약, 멀티catch블럭에 두 Exception을 썼는데
A만 가지고 있고 B는 가지지 않은 메소드를 쓰면?
ㄴ 오류, 왜? B예외가 발생하면 예외 처리가 안 됨
A와 B의 조상 예외 클래스에 선언 된 멤버(공통 멤버)만 사용 가능
<예외 발생 시키기> - throw로 고의 예외 발생
1. 연산자 throw로 발생 시키려는 예외 클래스 객체 생성
Exception e = new Exception("고의로 발생 시킴");
2. 키워드 throw를 이용해 예외 발생 시킴
throw e;
Exception 인스턴스 생성시, 생성자에 문자열을 넣어주면
getMessage() 로 해당 메시지 출력 가능
<checked 예외, unchecked예외>
checked 예외 - Exception 클래스와 그 자손들 (예외처리 필수)
unchecked 예외 - RuntimeException 클래스와 그 자손들 (예외처리 선택)
ㄴ 왜? RuntimeException은 프로그래머가 실수할 때 나타나는 거라서
예외 처리를 강제하지 않는다(어떻게 될지 모르니까)
만약 강제하면 RuntimeException이 발생할 수 있는 모든 부분에
예외 처리(try-catch)를 해줘야 함....
'국비 학원 가서 개발새발' 카테고리의 다른 글
국비학원 11일차) ArrayList 예습)예외,컬렉션,HashSet,Map 등 (1) | 2022.10.13 |
---|---|
국비학원 10일차) 추상클래스, 인터페이스 // 예습:Collection, List, Stack, Queue (0) | 2022.10.12 |
Comparable 과 Comparator 차이(익명클래스 사용) (0) | 2022.10.10 |
예습) 프로그램 오류(에러와 예외) (0) | 2022.10.09 |
예습) 디폴트 메서드와 스태틱 메서드(인터페이스) , 내부클래스... (1) | 2022.10.08 |