예외

Lumi·2021년 6월 24일
0

자바의 정석

목록 보기
18/35
post-thumbnail

1. 프로그램 오류

컴파일 에러 : 컴파일 시에 발생하는 에러
런타임 에러 : 실행 시에 발생하는 에러
논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것

에러 : 수습할수 없는 심각한 오류
예외 : 수습할수 있는 미약한 오류

2. 예외클래스의 계층구조

두 그룹으로 나누어 지게 된다.
1. Exception클래스와 그 자손들
2. RuntimeException클래스와 그 자손들

Exception클래스들 : 사용자의 실수, 외적인 요인으로 발생
RuntimeException클래스들 : 프로그래머의 실수로 발생

Exception클래스가 예외 클래스중 최상위 조상클래스이다

3. 예외처리하기(try - catch문)

예외는 프로그래머가 미리 대처할수 있기 떄문에 처리를 미리 해주어야 한다.

주로 try-catch를 이용한다.

catch블럭 같은경우에는 하나 이상이 올수 있으며 예외의 종류에 일치하는 단 한가지 catch블럭이 실행된다.
-> 만약 예외의 종류에 일치하지 않는다면 실행 되지 않는다.

4. try-catch문에서의 흐름

try블럭 내에서 예외가 발생한 경우
1. 발생한 예외와 일치하는 catch블럭을 찾아본다.
2. 일치하는 catch블럭을 찾으면 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 수행한다.

try블럭 내에서 예외가 발생하지 않은 경우
1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행한다.

try블럭에서 예외가 발생하면, 예외가 발생한 위치 이후에 있는 try블럭의 문장들은 수행이 되지 않는다
==> 주의하여 try블럭에 포함시킬 코드의 범위를 선정해야 한다.

5. 예외의 발생과 catch블럭

catch(){} 로 구성되어 있음

() 안에는 처리하고자 하는 예외와 같은 타입의 참조변수를 선언
{} 안에는 예외발생시에 실행시킬 코드를 입력

첫번쨰 catch블럭에서 조건에 맞는 예외를 찾게되면 그 이후의 catch블럭은 실행이 되지 않는다.
== 단 한개만의 catch구문이 발생한다.

만약 ()안에 예외 타입을 Exception으로 선언하게 된다면 모든 예외를 처리할수 있다.
== Exception이 최상위 조상 클래스 이기 떄문에

printStackTrace() : 예외발생 당시의 메서드의 정보와 메시지를 화면에 출력
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 출력
--> 모두 참조변수.~~ 으로 사용이 가능한 메서드들

멀티 catch블럭도 사용이 가능하다

catch(예외코드1 | 예외코드2){}
1,2둘중 하나의 예외가 걸리면 catch문이 발동

하지만 멀티 catch블럭을 사용할떄에는 조상과 자손의 관계가 되면 안된다.
--> 조상 + 자손 == 조상 이기 떄문에

6. 예외 발생시키기

개인적으로는 왜 고의로 예외를 발생시키는지는 모르겠다.

키워드 throw를 사용해서 고의로 예외를 발생시킬 수 있다.
example
Exception e = new Exception();
throw e;
== throw new Exception(); 와 같은 내용

7. 메서드에 예외 선언하기

메서드에 예외를 선언하려면, 선언부에 키워드 throws를 사용한뒤 발생할 수 있는 예외를 적어주면 된다.

=> 이 메서드를 사용하기 위해서는 어떤 예외들을 처리해야 하는지를 알수가 있다.
== 메서드를 사용하는 쪽에서 처리하라고 강요 가능

8. finally블럭

예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다,
선택적으로 마지막에 덧붙여 사용할수 있다.

9. 자동 자원 반환(try-with-resources)

주로 입출력에서 사용되는 구문으로 후에 배우게 된다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글