Free Lines Arrow
본문 바로가기
Language/Java

[Java] Exception(예외)

by skahn1215 2021. 8. 23.
728x90
반응형

Exception

  • Exception 과 처리방법을 알아봅니다.

 

 

 

Error(에러) 와 Exception(예외)

Error 와 Exception 에는 차이점이 존재한다.

 

 

 

Error

  • 시스템 레벨에서 프로그램에 심각한 문제를 일으킨다.
  • 실행중인 프로그램을 비정상 종료한다.
  • 개발자가 예측 할수 없다.
  • Error에 대한 처리는 할 수 없다.

 

 

 

Exception

  • 실행중인 프로그램을 비정상 종료시킨다.
  • 발생할 수 있는 상황을 예측하여 처리 할 수 있다.
  • 개발자는 예외처리를 통해 상황을 해결할 수 있다.

 

 

 

Exception 처리 과정

  • try 문으로 들어가면 해당 문 안에 있는 logic을 수행한다.
  • Exception 이 발생하면 Exception을 처리하기 위한 catch 을 찾는다.
  • 해당 하는 catch 문이 없을 경우 finally 문으로 들어가게 된다.
try {
     try {
        // logic 수행
    } catch (IOException e) {
        // Exception 발생시 해당 블럭에 들어옴
    } catch (SQLException e) {
        // ....
    }

} catch (ClassNotFoundException e) {
    // ....
} catch (IllegalAccessException e) {
    // ....
} finally {
    // 예외 발생이 안했을경우 해당 블럭으로 들어온다.
}

 

 

 

 

Exception 클래스

 

 

 

 

  • RuntimeException 클래스를 상속받는 자식 클래스들 치명적인 예외가 아니기 때문에
    try catch 보다 프로그램을 개발 하면서 예외가 발생하지 않도록 해야 한다.

  • 하지만 다른 Exception은 치명적이기 때문에 반드시 익셉션 처리를 해줘야 한다.

 

 

 

예외 복구, 회피, 전환

예외복구:

  • 예외가 발생 했을 경우 예외 상황을 알려준다.
  • 대안을 찾아서 해결해 준다.

 

 

구현방법

  • 예외가 발생했을때 적절한 방식으로 코드를 수행하게 해준다.
  • 예를 들어 파일을 찾을때 해당 파일이 없으면 IOException이 발생한다.
  • 그렇게 되면 백업파일을  열어 정상적으로 수행되게 한다.

 

 

 

구현

public class ExceptionEx {

    public static void main(String[] args) {

        try {
            // 파일 열기 수행
        } catch (IOException e) {
            // 백업파일 열기 수행
        }

    }

}

 

 

 

 

 

예외 회피:

  • 예외를 자신이 직접 처리하지 않고 호출한 쪽으로 던지는 방식이다.

 

 

구현방법

  • 메소드 선언부에 throws 키워드를 사용하여 해당 메소드를 사용할때 발생할 수 있는 예외를 미리 
    명시 할수 있다.
  • 이렇게 하면 해당 메소드를 사용할 때 발생할 수 있는 예외를 사용자가 충분히 인지할 수 있다.

 

 

구현

public class ExceptionEx {

    // throws 발생할수 있는 예외선언
    // 해당 메소드에서는 Exception 모든 익셉션이 발생 할수 있다.
    static void handlingException() throws Exception { 
        // Exception을 던진다.
        throw new Exception(); 
    }

 

    public static void main(String[] args) {
        try {
            // 코드실행
            handlingException();
        } catch (Exception e) {
            // handlingException() 에서 던진 예외를 catch가 잡아 처리한다.
            System.out.println("main() 메소드에서 예외가 처리됨!");
        }

    }

}

 

 

 

 

예외 전환

  • 발생한 예외에서 또다른 예외를 던지는 것이다.
  • 사용하는 이유는 예외를 받아 처리할때 명확하게 인지 하도록 한다.

 

 

 

구현방법

  • 예외가 발생 했을경우 또 예외를 던지면 된다.

 

 

구현

try 문 안에서 service 로직을 수행하다가 exception이 발생하면

어떤 종류의 Exception인지 확인 후 세부적인 Exception 을 던져준다.

public void addMember(Member member) throws DuplicateMemberException, SQLException {
    try {
            //jpa 를 이용하여 회원을 저장한다.
    }
    catch(AppException e) {
        if(e.getErrorCode() == AppError.DUPLICATE_MEMBER) {
            throw DuplicateMemberException();
        } else {
            throw e; //그 외의 경우는 SQLException 그대로
        }
    }
}

 

 

 

 

try-with-resources

  • 사용한 자원을 자동을 해제해 주는 문이다.
  • 파일을 열어서 읽었으면 다시 닫아줘야 한다. 
  • 하지만 해당 구문을 사용하면 한방에 해결 할 수 있다.

 

적용전

static String readFile(String filePath) throws IOException {

    BufferedReader br = new BufferedReader(new FileReader(filePath));

    try {

        return br.readLine();

    } finally {

        if (br != null)

            br.close();

    }

}

 

 

적용후

static String readFile(String filePath) throws IOException {

    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {

        return br.readLine();

    }

}

 

 

 

 

 

 

 

참고:http://tcpschool.com/java/java_exception_intro

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

728x90
반응형

댓글