이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: 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 구문 낭비를 방지

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 [자바의 정석] ch8-1~3 프로그램오류. 예외 클래스의 계층구조

📑 자바의 정석 8장 - finally 블럭