럿고의 개발 노트

[프로그래머스] 자바 입문 > Part9. 예외처리 본문

Java Note/[프로그래머스] 자바 입문(동영상 강의)

[프로그래머스] 자바 입문 > Part9. 예외처리

KimSeYun 2020. 1. 30. 11:29

[프로그래머스] 자바 입문

Part9. 예외처리

1. Exception

인터페이스 만들기

  • 프로그램 실행 중 예기치 못한 사건을 예외라고 한다.
  • 예외 상황을 미리 예측하고 처리할 수 있는데, 이것을 예외처리라고 함.
  • 예외처리 문법
    • 오류가 발생할 예상 부분은 try 블록으로 감싼 후, 발생할 오류와 관련된 Exception을 catch라는 블록에서 처리
    • 오류가 발생했든 안했든 무조건 실행되는 finally 블록을 가질 수 있음(생략 가능)
      try {
        오류날것 같은 구문
      } catch(오류) {
        오류 발생시 실행문
      } finally {
        오류가 발생하던 발생하지 않던 무조건 실행될 문
      }
  • try블록에서 여러 종류의 Exception이 발생한다면 catch블록을 여러개 둘 수 있음.
  • Exception클래스들은 모두 Exception클래스를 상속받으므로, 예외 클래스에 Exception을 두게 되면 어떤 오류가 발생하든지 간에 하나의 catch블록에서 모든 오류를 처리할 수 있음.
public class ExceptionExam {
    public static void main(String[] args) {
        int i = 10;
        int j = 0;

        /* try-catch-finally
         * try{ // 실행할 코드
         *         ....
         * } catch(예외클래스 변수명) { // 예외 처리 블록
         *         ....
         * } finally{ // 예외 발생 여부 상관없이 반드시 실행(생략가능)
         *         ....
         * } 
         */

        try {
            int k = 1 /j;
        }catch(ArithmeticException e) { // 예외가 발생하지 않으면 실행하지 않음
            System.out.println("0으로 나눌 수 없습니다." + e.toString()); //e.toString은 예외 정보를 알려주는 메소드
        }finally {
            System.out.println("오류 여부 상관없이 실행");
        }
        System.out.println("Main End!");

        // catch문은 여러개가 가능
        // Exception클래스는 모든 Exception클래스를 상속받기 때문에 모든 예외처리 가능
    }
}

2. Throws

throws

  • 예외가 발생했을 때 예외를 호출한 쪽에서 처리하도록 던져줌
public class ExecptionExam2 {
    public static void main(String[] args) {
        int i = 10;
        int j = 0;
        try {
            int k = divide(i, j);            
        }catch(ArithmeticException e) {
            System.out.println(e.toString());
        }
    }

    public static int divide(int i, int j) throws ArithmeticException { 
        // 오류를 메서드 내에서 처리하지 않고 메소드를 실행하는 곳에 떠넘기는것이라고 생각하면 됨
        // 오류를 여러개 넘길수도 있음.
        // Exception도 사용 가능
        int k = i/j;
        return k;
    }
}

3. Exception 발생시키기

Exception 발생시키기

  • 강제로 오류를 발생시키는 throw

  • throw는 오류를 떠넘기는 throws와 보통 같이 사용

public class ExecptionExam3 {
    public static void main(String[] args) {
        int i = 10;
        int j = 0;
        try {
            int k = divide(i, j);            
        }catch(IllegalArgumentException e) {
            System.out.println(e.toString());            
        }
    }

    public static int divide(int i, int j) throws IllegalArgumentException { 
        // 강제로 오류를 발생시키는 throw
        // throw는 오류를 떠넘기는 throws와 보통 같이 사용
        if(j == 0 ) {
            throw new IllegalArgumentException("0으로 나눌 수 없습니다.");
        }
        int k = i/j;
        return k;
    }
}

4. 사용자 정의 Exception

사용자 정의 Exception

  • Exception 클래스를 상속 받아 정의한 checked Exception

    • 반드시 오류를 처리해야만 하는 Exception
    • 예외 처리하지 않으면 컴파일 오류를 발생시킴
  • RuntimeException 클래스를 상속 받아 정의한 unChecked Exception

    • 예외 처리하지 않아도 컴파일 시에는 오류를 발생 시키지 않음
public class BizException extends RuntimeException { // unChecked Excpetion
        // 사용자 정의 Exception
        // public class 클래스이름 extends Excption{
        //    ...
        // }
        // Exception이나 Exception의 후손을 상속받아 만들어진 클래스
        // 클래스의 이름만으로 어떤 오류가 발생했는지 알려주어 코드의 직관성을 높임
        // 상속받은 Exception들을 Checked Exception이라고 함
        // 반드시 오류를 처리 해야 함
        // Runtime Exception클래스를 상속 받은 unChecked Exception
        // 예외 처리를 하지 않아도 컴파일 시에는 오류 발생하지 않음
        // 생성값만 정의해주면 됨

    public BizException(String msg) {
        super(msg);
    }
    public BizException(Exception ex) {
        super(ex);
    }
}    
public class BizService {
    public void bizMethod(int i) throws BizException{
        System.out.println("비즈니스 메소드 시작");

        if(i < 0) {
            throw new BizException("매개변수 i는 0 이상이어야 합니다.");
        }

        System.out.println("비즈니스 메소드 종료");
    }
}
public class BizExam {
    public static void main(String[] args) {
        BizService biz = new BizService();
        biz.bizMethod(5);
        try {
            biz.bizMethod(-3);            
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

※ 출처

[프로그래머스] 자바 입문

Comments