본문 바로가기
Study/Java_study

Java_study_9 (예외처리)

by hjshims 2021. 8. 23.

♨학습내용

더보기

☞ 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

자바가 제공하는 예외 계층 구조

Exception과 Error의 차이는?

RuntimeException과 RE가 아닌 것의 차이는?

커스텀한 예외 만드는 방법

 

  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

- 에러(Error)는 어쩔 수 없지만 예외(Exception)는 프로그래머가 이에 대한 처리를 미리 해주어야 한다.

- 예외 처리란, 이처럼 프로그램 실행 시 발생할 수 있는 예기치 못한 예외 발생에 대비한 코드를 작성하는 것이다.

- 예외처리의 목적은 예외 발생으로 인한 비정상적인 종료를 방지하고 정상적인 상태를 유지할 수 있도록 하는 것이다.

 

  • try-catch

- 하나의 try 블럭 다음에는 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch 블럭이 올 수 있으며, 이 중 일치하는 단 하나의 catch 블럭만 수행된다.

- 하나도 일치하지 않는 경우에는 아무것도 수행되지 않는다.

- 즉, 예외가 처리되지 않아 비정상적으로 종료된다.

- 만약, try블럭의 로직에서 예외가 발생하지 않는 경우에는 전체 try-catch 문 이후의 로직이 수행된다.

 

try {
    // 예외가 발생할 가능성이 있는 문장
} catch (발생할 수 있는 예외타입1 예외1) {
    // 발생할 수 있는 예외타입1 이 발생했을 경우, 실행될 문장
} catch (발생할 수 있는 예외타입2 예외2) {
    // 발생할 수 있는 예외타입2 이 발생했을 경우, 실행될 문장
}

 

public int divide(int leftOperand, int rightOperand) {
    try {
        return leftOperand / rightOperand;
    } catch (ArithmeticException arithmetic) {
        System.out.println("ArithmeticException");
    } catch (Exception e) {
        System.out.println("Exception");
    }
}

 

  • throw

- 키워드 throw를 사용하면, 프로그래머가 고의로 예외를 발생시킬 수 있다.

 

throw new RuntimeException("요청 형식이 맞지 않습니다.");

 

- Exception 인스턴스를 생성할 때, 생성자에 String을 넣어 주면, 이 String이 Exception 인스턴스의 메세지로 저장된다.

- 이 메세지는 .getMessage() 메서드를 이용해서 얻을 수 있다. 

 

  • throws

- 예외를 처리하는 방법에는 try-catch 문을 사용하는 것 외에, 예외를 메서드에 선언하는 방법이 있다.

- 메서드에 예외를 선언하는 방법은 메서드 선언부에 throws 키워드를 사용해서 메서드 내부에서 발생할 수 있는 예외를 적어주면 된다.

- 메서드를 호출한 곳으로 예외를 떠넘기는 방법이다.

 

public class tTest {
   public static void main(String[] args) {
      tTest test = new tTest();
      try {
         System.out.println(tTest.createException(10,0));
      } catch (ArithmeticException e){
         System.out.println("0");
      }
   }

   public int createException(int num1, int num2) throws ArithmeticException {
      return num1/num2;
   }
}

 

  • finally

- try-catch 과정에서 어떤 예외 상황 발생 여부와 상관없이 무조건 실행되는 영역이다.

 

public class FTest {
   public static void main(String[] args) {
      FTest test = new FTest();
      try {
         test.throwException();
      } catch (ArithmeticException e){
         System.out.println("Fail by Exception");
      } finally {
         System.out.println("finally Exception.");   
      }
      System.out.println("Bye, Exception!");
   }

   public void throwException() throws RuntimeException {
      throw new RuntimeException();
   }
}

 

- throwException()은 리턴타입은 없지만, RuntimeException을 던지는 메서드이다.

- 메인 메서드에서 throwException()을 호출함으로써 예외가 발생했지만, catch에서 처리하지 못하면서 RuntimeException에 의해 프로그램이 중단된다.

- 프로그램이 비정상적으로 중단되는 바람에 try-catch 바깥의 코드는 실행되지 못했지만, finally 안의 코드는 예외 발생 여부와 상관없이 정상적으로 출력된다.

- 예외와 상관없이 무조건 실행되어야할 코드는 finally 안에 작성할 필요가 있다.

 

 


 

 

  • 자바가 제공하는 예외 계층 구조

https://reference-m1.tistory.com/246

 

- 에러, 예외 클래스는 Throwable 클래스를 상속받는다.

- Java Exception클래스는 checked, unchked 클래스로 구분한다.

- 위에 그림에서 빨간색은 checked 예외, 파란색은 unchecked 예외 클래스에 해당한다.

 


  • Exception과 Error의 차이는?
  • Exception (예외)

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

- 예외가 발생하더라도 프로그래머가 이에 대비한 적절한 코드를 작성하여 프로그램의 비정살 종료를 막을 수 있다.

 

  • Error (오류)

- 메모리부족 (OutOfMemeryError) 이나 스택오버플로우 (StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류를 의미한다.

- 개발자는 예외에 대한 적절한 코드를 미리 작성해놓음으로써 프로그램의 비정상적인 종료를 막아야한다.

 


 

  • RuntimeException과 RE가 아닌 것의 차이는?

- RuntimeException을 상속받는 예외는 Unchecked Exception이라고 하고,

- 상속받지 않는 예외는 Checked Exception이라고 한다.

 

  • Unchecked Exception

- 말 그대로 체크가 불가능한 Exception이다.

- Checked Exception과는 반대로 자바에서 예외 처리를 강제화하지 않습니다.

 

class Main {
  public static void main(String[] args) {
    throw new RuntimeException(); // 이와 같이 RuntimeException을 던져도 컴파일상 문제 없음
  }
}

 

 

  • Checked Exception

- 체크가 가능한 Exception을 말하며 이를 자바는 강제로 예외 처리를 하라고 알려준다.

 

try {
  throw new IOException(); // 예외를 던짐
} catch(Exception e) {
  // 예외 핸들링..
}

 


 

  • 커스텀한 예외 만드는 방법

- 기존에 정의된 예외 클래스 외에 필요에 따라 프로그래머가 새로운 예외 클래스를 정의할 수 있다.

- 예외처리가 필수인 경우에는 Exception 클래스를, 예외처리가 필수가 아닌 커스텀 예외는 RuntimeException을 상속받아 정의한다.

- 커스텀 예외 클래스는 생성자뿐만 아니라 필드, 메소드도 원하는 만큼 추가가 가능하다.

 

class CheckedException extends Exception {
    CheckedException(String str) {
        super(str);
    }
}

class UnCheckedException extends RuntimeException {
    UnCheckedException(String str) {
        super(str);
    }
}

 

 

 

'Study > Java_study' 카테고리의 다른 글

Java_study_11 (Enum)  (0) 2021.09.07
Java_study_10 (멀티쓰레드 프로그래밍)  (0) 2021.08.30
Java_study_8 (인터페이스)  (0) 2021.08.17
Java_study_7 (패키지)  (0) 2021.08.11
Java_study_6 (상속)  (0) 2021.08.09