본문 바로가기
JAVA

[JAVA 개념4] 예외처리

by 자유데이터 2018. 11. 12.
반응형

1.예외의 개념과  종류

Throwable Class(자바에서 생기는 모든 오류)
  • 에러(Error)
            :프로그래머가 제어할 수 없는 오류
                -하드웨어의 잘못된 동작이나 고장

  • 예외(Exception)
            :프로그래머가 제어할 수 있는 오류
                -잘못된 코딩으로 인한 오류
                -예외가 발생되면 프로그램 종료

ㄴException Class
  • 일반 예외(CkeckedException)
               : 반드시 예외처리해야할 오류
                :확인 시점-컴파일단계

  • 실행 예외(RuntimeException)
               : 프로그램 실행중에 발생가능한 오류
                 (컴파일러가 체크해주지 않으며 개발자 경험에 의해 처리 해야 한다.)
                :확인시점-실행단계


2.자주 나오는 RuntimeException
  • NullPointerException
: 객체가 없는 참조변수로 도트연산자를 사용했을때 (도트: 객체접근연산자)
String name = null;
name.length(); 

  • ArrayIndexOutBoundsException
: 배열에서 인덱스 범위 초과하여 사용할 때.

  • ClassCastException
: 타입 변환이 되지 않을 경우. 객체 형이 다른 형으로 캐스팅할 때 맞지 않으면 발생한다.


3.예외 처리 코드(try - catch - finally)
예외 발생시 프로그램 종료 막고, 정상 실행 유지할 수 있도록 처리하는 코드를 말한다.
CheckedException이든 RuntimeException이든 둘 다 잡는다.


세 가지 블록이 항상 같이 써야하는 것은 아니다. 단, catch와 finally은 try 블록이 꼭 있어야 한다.

다중 catch가 가능하나 예외의 개수를 알 수 없기 때문에 경험에 의해서 설정해야 한다. catch(매개변수)를 잊지말자.
다중 catch에서 구체적인 예외처리 매개변수는 상위에 위치해야 한다. 순서가 중요하다!! (잘못되는 경우 컴파일 오류가 난다.)


멀티 catch는 논리 합으로 만들어지고 매개변수는 끝에만 쓴다.

try{
    스캐너 생성 ---> 자원 생성
    스캐너 사용 ---> 자원 사용
//스캐너 닫기 ---> 
}

이러한 예외처리 방법은 자바의 대표전 Testing Framework인 JUnit으로 확인하는 것이 좋다.
JUnit은 단위 테스팅 프레임워크로 메이븐에서 쉽게 설치가 가능하다.

JUnit을 활용할때 예외가 발생하면
  1. 발생된 예외 클래스명과 예외 메시지가 첫라인에 출력
  2. 1)밑에, 예외가 어디서 어떤 과정을 거처 발생했는지를

첫 줄은 반드시 끝까지 읽어라.

예외처리코드 사용시 주의할 점은 try/catch문을 사용하여 예외를 잡고 아무런 처리도 하지 않으면,
예외가 발생했을때 그 원인을 파악하기 어려워 유지,보수에 치명적일 수 있다.

ex) try-catch
물건배달의 예제를 들어보았다.
public class Test {
    ItemDelivery () {
        try{
            ItemCheck();
            Package();
            Delivery();
        }catch(DeliveryFailException e) {
            Cancel();
        }finally{
            Message();
        }//.try-catch
}//.Test
ItemCheck() throws DeliveryFailException {
    ...
}//.ItemCheck

Package() throws DeliveryFailException {
    ...
}//.Package

Delivery() throws DeliveryFailException {
    ...
}//.Delivery

물건배송할때(ItemDelivery 메소드)
try :: 체크(ItemCheck) - 포장(Package) - 배달(Delivery) 순서로 진행되며
catch :: 하나라도 실패할 경우 취소(Cancel)가 된다는 의미이다. (DeliveryFailException)
finally :: 취소가되든 성공하든 고객에게 메세지(Message)를 보내는 상황인 것이다.

위의 상황처럼 실패할 경우 모두 취소하는 것을 Rollback이라 한다.
상황에 따라 롤백을 하지 않으면 데이터 간의 정합성이 크게 흔들리게 된다.


4.Throws
throws는 예외를 던지는 방법으로, 호출하는 쪽에서 알맞게 예외처리하도록 할때 사용한다.

위의 예제를 재활용하면

public void ItemDelivery() throws DeliveryFailException{
    if(ItemCheck()=="fail") {
        throw new DeliveryFailException();
    }//.if
}//.ItemDelivery

ItemCheck가 실패할 경우 DeliveryFailException을 불러와 예외처리하도록 한 것이다.
이때 throw new 라는 표현을 사용하고 메소드 옆에 throws를 사용하여 던져준다.

DeliveryFailException은 CheckedException이나 RuntimeException을 상속받은 클래스를 만들어서 사용한다.
둘 중에 어떤 것을 상속받을 지는 생각을 해야하는데,
CheckedException은 프로그램 작성 시 이미 예측가능한 예외일때 사용하고
RuntimeException은 발생 할수도 안 할수도 있는 경우에 사용한다.

정리
checkedexception
-내가 직접하겠다
-throw; 나는 처리 못하겠다. 나를 호출하는 쪽에서 잘 처리 해주세요/코드처리할때 오류가 생길 수도 있으니 잘 처리하세요.

runtimeException
-아무것도 안하겠다.(자동으로 위로 던저진다)
-try-catch로 직접 처리하겠다







반응형

댓글