본문 바로가기
국비 학원 가서 개발새발

예습)예외 처리(try-catch)

by 휴일이 2022. 10. 10.

 

<예외 처리> - 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)를 해줘야 함....

728x90