티스토리 뷰

TIL/JAVA

예외처리(Exception)

YEIKKI 2023. 1. 11. 22:41

컴파일(compile): 해당 언어로 작성된 컴퓨터 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스

 

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

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

논리적 에러- 실행은 되지만,  의도와 다르게 동작하는 것 

 

런타임에러(실행 중 에러)

(1)Error : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

(2)Exception: 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

예외처리(Exception handling)

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

목적: 프로그램의 비정상 종료를 막고 정상적인 실행상태 유지

 

 

 

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

RuntimeException 클래스들:  프로그래머의 실수로 발생하는 예외

 


Exception 키워드

try: 예외를 발생할 것으로 예상되는 코드를 블럭으로 지정하는데 사용되며, try블록 다음ㅇ에는 catch 또는 finally가 와야한다.

catch-예외를 처리하는데 사용, catch 블록만 단독으로 사용할수없어서 try블록이 앞에 와야 catch 블록이 뒤에 올수있다.

 


try-catch문에서의 흐름

예외발생 하지 않은 경우

예외가 발생한 경우

-이를 처리할 catch블럭을 찾아 내려감 

-일치하는 catch블럭이 없으면 예외는 처리안됨

-Exception이 선언된 catch 블럭은 모든 예외 처리(마지막 catch블럭)


printStackTrace():

예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면 출력

getMessage() :

발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수있다.

 


멀티 catch 블럭:

-내용이 같은 catch블럭을 하나로 합친 것(JDK1.7부터)

-ExceptionA와 B가 조상-자손 관계일 경우, 조상만 써주면 됨. 멀티 catch 블럭 사용할 경우, 참조변수로는 두 예외 클래스의 공통 멤버만 사용 가능.

 


예외발생시키기

연산자 new를 이용해서 발생시키려는 예외클래스의 객체를 만든 다음

키워드 throw를 이용해서 예외를 발생시킨다.

throw e;


checked , unchecked예외

checked예외:

컴파일러가 예외처리 여부를 체크(예외 처리 필수)RuntimeException클래스를 상속받지 않은 예외 클래스들

복구 가능성이 있는 예외이기에 반드시 예외처리하는 코드를 작성해야함  

 unchecked예외:

컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)RuntimeException클래스를 상속받은 예외클래스들

복구가능성 없는 예외이기에 예외처리를 강제로 하지 않는다.

 

 


메서드에 예외선언하기

(1)예외를 처리하는 방법: try-catch문, 예외선언하기 (직접 처리하기) 위에 있는 예시들 처럼 처리하면됨!

(2)메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것(떠넘기기)


finally블럭

-예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.


사용자 정의 예외 만들기

-우리가 직접 예외 클래스를 정의할수 있다.

-조상은 Exception과 RuntimeException중에서 선택


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

-예외를처리한후 에 다시 예외를 발생시키는 것

-호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것

 


연결된 예외(chained exception)

-한 예외가 다른 예외를 발생시킬수 있다.

-예외 A가 예외 B를 발생시키면 A는 B의 원인 예외(cause exception)

 

Throwable initCause(Throwable cause) 

 :지정한 예외를 원인 예외로 등록

 

Throwable getCause()

:원인 예외를 반

 

사용하는 이유:

(1)여러 예외를 하나로 묶어서 다루기 위해서

 

(2)checked예외를 unchecked예외로 변경하려 할때

static void startstall() throws SpaceException, MemoryException {
if(!enoughSpace())    //충분한 공간이 없으면 
throw new SpaceException("설치할 공간이 부족합니다");

if(!enoughMemory())  //충분한 메모리가 없으면                           개선전
throw new MemoryException("메모리가 부족합니다.");
}
-------------------------------------------------------------------------------

static void startstall() throws SpaceException{
if(!enoughSpace())    //충분한 공간이 없으면 
throw new SpaceException("설치할 공간이 부족합니다");                  //개선후

if(!enoughMemory())  //충분한 메모리가 없으면             개선전
throw new RuntimeException(new MemoryException("메모리가 부족합니다."));// unchecked Exception으로 
                                                                      //바꿔줌
}

참고문헌 :남궁성, 『자바의정석』, 도우출판

 

 

'TIL > JAVA' 카테고리의 다른 글

java.lang패키지와 유용한 클래스  (0) 2023.01.15
객체지향(OOP)인터페이스  (0) 2023.01.12
객체지향(OOP)추상클래스(abstract class)  (0) 2023.01.11
객체지향(OOP)제어자  (0) 2023.01.11
객체지향(OOP)다형성  (0) 2023.01.09