이 글은 남궁성의 정석코딩 [자바의정석-기초편]을 수강하며 정리한 글입니다.
🟣 기본 환경: IDE: Eclipse, Language: Java
프로그램 오류
1. Compile time Error: 컴파일 발생 시 에러
(cf. Compiler 역할: 구문 체크, 번역, 최적화)
2. Runtime Error: 실행 시 발생 에러
Runtime Error의 종류
2.1. Error: 수습할 수 없는 심각한 오류
2.2. Exception: 수습할 수 있는 다소 미약한 오류
Exception의 종류
2.2.1. exception과 그 자손: checked 예외-컴파일러가 에러 확인, try catch 필수
2.2.2. runtimeexception과 그 자손: unchecked 예외-try catch 선택
예: arithmetic, classcast, nullpoint, indexoutofbound 등
3. Logical Error: 작성 의도와 다르게 동작
Exception class: 프로그램 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
RuntimeException class: 프로그래머의 실수로 발생하는 예외
- Arithmetic Exception: 산술 계산 예외(5/0)
- ClassCast Exception: 형변환 오류
- NullPointException: String = null; String.length
- IndexOutOfBounds Exception: 배열 범위 벗어남
예외 처리: try-catch
try{} // 예외 발생 시, 그 이후 문장 수행X
catch(exception e1){}
catch(exception e2){} // catch 발생 후 문장 수행X
catch(exception e3){}
*if문과 달리 {} 생략 불가
만일 일치하는 catch 블럭이 없으면 예외가 처리되지 못함
이후 실행되어야하는 문장도 실행X
Exception은 모든 예외의 조상이라 모든 예외 처리 가능
그러므로 마지막 catch 블럭으로 활용
예외 발생시키기
Exception e = new Exception(”예외 메세지”)
throw e;
예외 발생 시 예외 객체 생성
: printStackTrace method 및 getMessage method 등이 있음
- printStackTrace: 예외 당시의 호출스택에 있었던 메서드의 정보와 예외 메세지를 화면에 출력
- getMessage: 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있음
- ArithmeticException ae: ae는 참조 변수
{} catch 블럭 내에서 사용 가능
멀티 catch 블럭
catch(ExceptionA e) {e.printStackTrace();}
catch(ExceptionB e2) {e.printStackTrace();}
→
catch(ExceptionA | ExceptionB e) {e.printSrackTrace();}
단, ()안에 부모자식관계X
(조상 class exception으로 자식 exception을 잡을 수 있으므로)
(ExceptionA){} 에 선언된 method A() 호출 불가
→ Exception A와 B의 공통 멤버만 사용 가능
(A인지 B인지 어디 객체가 소환되었는지 알 수 없으므로)
정쓰고 싶으면 형변환
if(e instanceof ExceptionA) {
ExceptionA e1 = (ExceptionA) e;
e1.methodA();
} else
checked exception: 컴파일러가 예외 처리여부를 확인(예외 처리 필수)
→ Exception과 그 자손
unchecked exception: 컴파일러가 예외 처리 여부를 체크하지 않으므로 예외처리 선택
→ runtime exception과 그 자손
→ 프로그래머가 주의해야하는 부분
throw 예외 발생
throws 예외 알리기
void method() throws Exception1, Exception2, … {}
void method() throws Exception {} - 필수처리 예외만 선언(안되는 건 아니지만..)
Cf. 오버라이딩 조건
선언부 일치
접근제어자 좁게 X
조상보다 많은 예외X (단순 갯수가 아닌 범위*)
finally {}
예외 발생 여부에 관계없이 항상 수행되어야하는 문장들을 넣는다.
finally 블럭은 try-catch 문의 맨 마지막에 위치
사용자 정의 예외
: Exception or RuntimeException 중 상속받기
예외 되던지기:
예외를 처리한 후에 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두가 예외처리를 하는 것
연결된 예외 사용이유:
여러 예외를 하나로 묶어주기 위해
checked exception을 unchecked exception으로 변경하려할 때
→런타임 예외를 만들어서 예외를 넣어줌
* 필수처리가 필요없는 exception이 있어서 Runtime Exception으로 바꿔서 try catch 구문 낭비를 방지
소스 코드
참고 자료
📑 [자바의 정석] ch8-1~3 프로그램오류. 예외 클래스의 계층구조
'Java > Java' 카테고리의 다른 글
[자바의 정석_기초편] Chapter09. java.lang package / Useful class_2 (0) | 2023.05.17 |
---|---|
[자바의 정석_기초편] Chapter09. java.lang package / Useful class_1 (0) | 2023.05.14 |
[자바의 정석_기초편] Chapter07. 객체지향(Object Oriented)_5 (0) | 2023.05.11 |
[자바의 정석_기초편] Chapter07. 객체지향(Object Oriented)_4 (0) | 2023.05.10 |
[자바의 정석_기초편] Chapter07. 객체지향(Object Oriented)_3 (0) | 2023.05.09 |