본문 바로가기
JAVA

예외처리(Exceptoin handling)

by 소라둥이 2020. 3. 23.

프로그램 오류

▶ 프로그램 오류

프로그램이 실행중 오작동을 하거나 비정상적으로 종료되는 경우의 원인

컴파일 에러 - 컴파일 시 발생 에러

런타임 에러 - 실행 시 발생 에러

논리적 에러 - 실행은 정상적이나 의도와 다르게 동작

▶JAVA의 런타임 에러

에러(error) - 프로그램 코드에 의해 수습 불가능 한 심각한 오류

예외(exception)-프로그램 코드에 의해 수습 가능한 미약한 오류

예외처리의 정의와 목적

▶예외처리의 정의

프로그램 실행 시 발생 할 수 있는 예외에 대비한 코드를 작성하는 것

▶예외처리의 목적

프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

예외처리하기

try-catch문

▶예외 종류

Exception 클래스와 자손 - 사용자의 실수와 같은 외적인 요인에 의해 발생

컴파일러가 예외처리 확인 (checked 예외) → 예외처리 필수!

RuntimeException 클래스와 자손 -프로그래머의 실수로 발생

컴파일러가 예외처리 확인 x (unchecked 예외) → 예외처리 선택!

▶예외 처리 방법 1. try-catch문

2. 예외선언(throws)

3. 예외 되던지기(1+2)

▶try-catch문

try-catch문의 구조

- try블럭 다음에는 하나 이상의 catch블럭 필수

- 예외종류와 일치하는 하나의 catch블럭만 실행

- catch문 내 문장이 없거나 하나뿐이여도 { } 필수

try-catch문 다중사용

- 하나의 메서드에 여러개의 try-catch문 사용가능

- try-catch문 내에 또다른 try-catch문 사용가능(단, 참조변수 이름 중복 x)

- 예외클래스의 최고 조상인 Exception는 마지막에 사용할 것

멀티 catch블럭

- 중복된 코드 제거

- 예외클래스 개수 제한 x

- 상속관계 예외클래스 연결 x

try-catch-finally

- 예외 발생 여부에 관계없이 finally 내 문장 항상 수행

- finally는 try-catch문 마지막에 위치

- return문 실행 시 finally 실행 후 메서드 종료

- System.exit(0);은 바로 프로그램이 종료 되므로 finally 실행 x

- try블럭의 첫번째 문장 실행 후 두번째 문장에서 예외발생(ArithmeticException)

- 두번째 문장 실행 x catch블럭으로 이동

- 조건에 맞는 catch블럭 문장 실행

- finally블럭 문장 실행

- try-catch문 종료 후 다음 문장 수행

예외 발생시키기

키워드 throw

▶키워드 throw

throw의 사용

- 연산자 new를 이용해 발생시키려는 예외클래스 객체 생성 후, throw를 이용 예외 발생

- Exception e = new Exception("에러 메세지 입력 가능");

- Exception e = new Exception(); throw e; → throw new Exception();

메서드에 예외 선언하기

키워드 throws

▶키워드 throws

- 메서드에 일어날 수 있는 예외 명시

- 메서드 사용자가 어떤 예외처리가 필요한지 쉽게 파악 가능

- 메서드 선언부에 throws를 이용, 여러 종류 예외 입력

- 최고조상인 Exception 입력 시 어떤 예외도 발생할 가능성 o

- 자손타입 예외도 발생 가능, 오버라이딩 시 개수와 상속관계 확인

- 예외처리가 필수적인 예외클래스 선언 ( checked 예외 )

 

메서드 내 직접 예외처리 / 예외 선언 후 메서드 사용 시 처리

- 메서드 내 직접 예외 처리 가능 ( 예외 처리한 메서드 사용 시 예외 여부 알 수 없음 )

- 예외 선언 후 예외처리 ( 메서드에서 발생 가능한 예외 선언 후 사용자가 예외 처리 )

예외 되던지기(exception re-throwing)

try-catch / 키워드 throw, trows 이용

예외 되던지기 예시

- 한 메서드에서 발생할 수 있는 예외가 여러 종류 인 경우,

일부는 try-catch를 통해 메서드 내에 자체적 처리, 나머지는 예외 선언 후 호출한 메서드에서 처리

- 예외 처리 후 인위적으로 다시 발생

- 위 예제를 보면 main에서 method1()실행 시 예외가 발생

→ 예외 처리 과정에서 인위적으로 예외를 발생시켜 다시 main으로 보냄.

(이때 발생시킨 예외는 메서드 내에서 처리하지 않고 보냈기 때문에 throws를 이용하여 선언)

→ main에서 다시 예외처리 완료

연결된 예외(chained exception)

▶연결된 예외

- 한 예외가 다른 예외를 발생시키는 것

- 예외 A가 예외 B를 발생시켰다면, A는 B의 원인예외

- 예외는 중간조상이 거의 없기에 포함관계를 이용

▶연결된 예외

- 여러가지 예외를 하나의 큰 분류의 예외로 묶기 위해 사용

- checked예외를 unckecked예외로 바꿀 때 사용

(checked예외를 처리 할 수 없을 시 unckecked예외로 변경해 예외처리 x)

예외 관계 표현

- 예외 1은 예외2,3을 포함시켜 만든 큰 븐류의 예외

- 예외 2,3은 예외 1의 원인예외

사용자정의 예외 만들기

예외 정보 얻기

printStackTrace와 getMessage

▶예외 정보 얻기

- 예외 발생 시 생성되는 예외 클래스의 인스턴스에 발생한 예외의 정보 저장

- pintStackTrace() : 예외발생 당시 호출스택에 있던 메서드의 정보와 메시지 출력

- getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻어옴

printStakcTrace와 getMessage 사용예시

'JAVA' 카테고리의 다른 글

[OOP] 객체지향프로그래밍  (0) 2020.04.17
[eclipse] Git Clone 프로젝트 서버 구동 불가 현상  (0) 2020.04.07
JRE와 JDK 차이점  (0) 2020.03.23