본문 바로가기

Foundation/- Java

예외처리

1.1 프로그램 오류

 

▶ 컴파일 에러(compile-time error)와 런타임 에러(luntime error)

컴파일 에러 - 컴파일할 때 발생하는 에러 ex) 오타

런타임 에러 - 실행할 때 발생하는 에러 ex) 배열 범위의 초과

논리적 에러 - 의도와 다른 결과를 초래 ex) 창고의 재고가 음수 등

 

▶ Java의 런타임 에러

에러 - 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

예외 - 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

 

 

1.2 예외처리의 정의와 목적

- 에러(error)는 어쩔 수 없지만, 예외(exception)는 처리해야 한다.

 

▶정의

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

▶목적

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

 

 

1.3 예외처리구문 - try{}catch(){}

- 예외를 처리하려면 try-catch문을 사용해야 한다.

 

▶ 예시

try{

//예외가 발생할 수 있는 문장들

}catch(Exception e){

//예외를 처리하는 문장들

}catch(Exception e1){

//예외를 처리하는 문장들

}

- 예시와 같이 try{}안에는 예외가 발생할 수 있는 문장을 넣고 그 문장에 여러가지 상황으로 에러가 발생할 수 있기 때문에 catch를 여러개 두어서 예외처리를 할 수 있다.

 

 

1.4 try-catch문에서의 흐름

▶ try블럭 내에서 예외가 발생한 경우.

1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.

2. 일치하는 catch블럭을 찾게 되면. 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다.

 

▶ ry블럭 내에서 예외가 발생하지 않은 경우,

1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.

 

위 예시를 보면 0/0 << 이부분에서 0으로 나누려고 시도했기 때문에

ArithmeticException오류가 발생한다. 따라서 catch문으로 넘어가고 5를 출력하면서 try-catch문을 빠져나온다. (4가 출력되지 않았음을 확인 할 수 있다.) try-catch문의 흐름을 파악할 수 있는 예제이다.

 

1.5 예외 발생시키기

(1) 먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스 객체를 만든 다음

Exception e = new Exception("고의로 발생시켰음");

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

throw e;

 

e.printStackTrace(); 는 Exception의 메서드로서 오류 메세지와 종류 그리고 어디서 발생했는지를 출력해준다. e.getMessage(); 메서드는 오류 메세지를 출력해준다. 생성자에 "고의로 발생시켰음.'의 오류 메세지가 출력된 것을 확인 할 수 있다.

 

1.6 예외 클래스의 계층구조

- 예외 클래스는 크게 두 그룹으로 나뉜다.

(1)RumtimeException클래스들 - 프로그래머의 실수로 발생하는 예외(예외 처리 선택)

(2)Exception클래스들 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는

  예외 (예외 처리 필수)

 

 

 

Exception 클래스는 예외 처리 필수 이기때문에 컴파일할때 위와 같이 바로 오류가 나타난다. 오류 메세지를 보면 must be caught or declared  예외처리를 필수라고 나온다. 따라서 다음과같이 예외처리를 해주면 다음과 같은 결과가 나오게 된다.

이와 다르게 RuntimeException은 예외처리를 선택사항 이기 때문에 문제없이 컴파일이 된다. 컴파일때는 문제가 안되지만 당연하게 실행할때는 오류가 나타난다.

 

위에서 설명했듯이 RuntimeException은 프로그래머의 실수로 인해 발생하는 것이기 때문에 예외처리를 할 필요없이 실수를 하지 않고 프로그래밍을 진행해야한다.

반대로 사용자는 실수할 수 있기 때문에 예외처리를 잘해줘야 한다.

 

 

1.7 예외의 발생과 catch블럭

- try블럭에서 예외가 발생하면, 발생한 예외를 처리할 catch블럭을 찾습니다.

- 첫번째 catch블럭부터 순서대로 찾아 내려가고, 일치하는 catch블럭이 없으면 예외처리가 안됩니다.

- 위의 문제를 해결하기 위해 예외의 최고 조상인 Exception을 처리하는 catch블럭을 넣어 준다면 모든 종류의 예외를 처리할 수 있습니다.

 

위 예제를 보면 0/0이 ArithmeticException이기 때문에 true가 출력이 되었고,

만약에 다른 예외가 나왔다면 조상 catch문인 Exception이 실행되어 Exception이 출력되었을 것이다.

 

 

1.8 finally블럭

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

- 선택적으로 사용할 수 있으며, try-catch-finally의 순서로 구성된다.

- 예외 발생시, try -> catch -> finally의 순서로 실행되고

  예외 미발생시, try -> finally의 순서로 실행된다.

- try 또는 catch블럭에서 return문을 만나도 finally블럭은 수행된다.

▶예시.

위 예제는 설치작업을하는 소스이다. 위의 메서드중 deleteTempFiles는 오류가 발생하든 발생하지 않던 실행되어야하는 코드이므로 중복이 되어있다.  따라서 다음과 같이 finally를 이용하여 바꿔줄 수 있다.

 

1.9 메서드에 예외 선언하기

- 예외를 처리하는 또 다른 방법

- 호출한 메서드로 전달해 준다.

- 호출한 메서드에서 예외처리를 해야만 할 때 사용

 

▶예시

 

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

- 예외를 처리한 후에 다시 예외를 생성해서 호출한 메서드로 전달하는 것

- 예외가 발생한 메서드와 호출한 메서드, 양쪽에서 예외를 처리해야 하는 경우에 사용

▶예시를 보면 쉽게 이해할 수 있다.

 

 

 

 

 

'Foundation > - Java' 카테고리의 다른 글

유용한 클래스(String class)(1)  (0) 2017.08.22
유용한 클래스(Object class)  (0) 2017.08.21
추상클래스, 인터페이스, 내부클래스  (0) 2017.08.15
제어자(modifier)  (0) 2017.08.04
생성자  (0) 2017.07.28