[Java] 예외처리

Gabriela·2023년 8월 1일
0

JAVA

목록 보기
19/24
post-thumbnail

Error와 Exception

Error

  • 시스템 레벨의 심각한 오류
  • 시스템 수정으로 문제를 해결 (대부분 하드웨어의 문제)

Exception

  • 프로그램 레벨의 일반적인 오류
  • 코드 수정으로 문제를 해결

일반적으로 발생하는 문제는 Error가 아닌 Exception임


  • 구조

예외(Exception)

  • 프로그램의 실행 중 발생하는 여러 가지 오류를 의미함
  • 예외가 발생하면 프로그램이 강제로 종료됨
  • 예외가 발생하더라도 프로그램이 종료되지 않도록 예외처리를 해야 함
  • try - catch문을 이용해서 예외 발생으로 인해 프로그램이 종료되는 것을 회피할 수 있음

예외 발생 예시


Exception의 구조

Exception 클래스

  • 모든 예외 클래스의 슈퍼클래스
  • 명시적 예외 처리 여부에 따라 Checked / Unchecked Exception으로 구분

Checked Exception

  • RuntimeException 클래스의 자식클래스가 아닌 모든 예외 클래스
  • 반드시 try - catch문으로 예외 처리를 해야 함
  • IOException, SQLException 등

Unchecked Exception

  • RuntimeException 클래스의 자식클래스로 등록된 모든 예외 클래스
  • try - catch문이 없어도 실행 가능
  • NullPointerException, NumberFormatException 등

  • 구조

예외 처리

try - catch문

  • 예외를 처리할 때 사용하는 코드

  • 실행코드try 블록에 두고 예외를 처리할 코드catch 블록에 두는 방식

  • try 블록의 코드를 실행하다가 예외가 발생되면 발생된 예외는 자동으로 catch 블록으로 전달됨

  • 모든 예외는 자바 클래스로 만들어져 있음

형식

try {
실행 코드
} catch(예외 타입 선언) {
예외 처리 코드
}

다중 catch 블록

  • 하나try 블록여러 개catch 블록이 추가될 수 있음

  • try 블록에서 발생된 예외는 우선 첫 번째 catch 블록을 방문함

  • 첫 번째 catch 블록이 처리하지 못하면 다시 두 번째 catch 블록을 방문함

  • 예외 클래스들의 상속 관계를 파악한 뒤 catch 블록을 작성해야 함

  • 슈퍼클래스 타입인 Exception이나 RuntimeException의 경우에는 마지막 catch 블록에서 처리

형식

try {
실행 코드
} catch(예외 타입 선언1) {
예외 처리 코드1
} catch(예외 타입 선언2) {
예외 처리 코드2
}

finally

  • try-catch문의 마지막 블록으로 추가할 수 있다. (생략 가능)

  • 예외 발생 여부와 상관 없이 항상 마지막에 실행된다.

  • 주로 어떤 자원을 반납(close)할 때 사용

형식

try {
실행 코드
} catch(예외 타입 선언) {
예외 처리 코드
} finally {
무조건 실행되는 코드
}

• finally 활용 예제

  public static void main(String[] args) {
   
    // 나이를 입력 받아서 "주류 구매 가능", "주류 구매 불가능" 출력하기
    // 예외처리
   
    // try 블록과 finally 블록에서 모두 사용할 수 있도록 scope 조정
    Scanner sc = null; // 선언
   
    try {
      sc = new Scanner(System.in);  // 생성
      System.out.println("몇 살이세요?");
      int age = sc.nextInt();
      System.out.println(age >= 20 ? "주류 구매 가능" : "주류 구매 불가능");
    } catch (Exception e) {
      System.out.println("잘 모르겠어요.");
    } finally {
      sc.close();  // finally는 주로 자원 반납용으로 사용한다.
    }
  }

  • scope : 범위 { }, 변수에 접근할 수 있는 범위의 기준이 된다.
  • 변수의 생명주기(life cycle) : 변수가 선언된 위치(scope) 내에서 생성되고 소멸되는 주기를 의미한다.
  • 자원반납할 때 사용되는 코드 : close()

throw 블록

  • 예외 객체를 직접 생성(new)해서 던질 때 사용한다.
  • Java는 예외로 판단하지 않는 것들을 던질 때 사용한다.
  • 개발자가 직접 예외를 처리할 때 사용한다.

throws

  • 메소드에서 발생하는 모든 예외를 던질 때 사용한다.

  • 메소드 내부에서 try-catch를 처리하지 않고, 메소드를 호출하는 곳으로 예외를 던질 때 사용한다.

  • 메소드를 호출하는 곳에서 try-catch를 처리한다.

  • 2개 이상의 예외를 명시할 수 있기 때문에 throw가 아닌 throws라고 한다.


• catch 블록 예외추적 활용 예제

  public static void ex01() {
   
    try {
     
      // 1. Java가 발생시킨 예외
      // int a = 5 / 0;
      // System.out.println(a);
     
      // 2. 개발자가 발생시킨 예외
      throw new RuntimeException("개발자 예외");
     
    } catch (Exception e) {
      // 예외 객체 e가 가진 메소드
     
      // 예외 클래스 확인하기
      System.out.println(e.getClass().getName());  // Object의 메소드 활용
     
      // 예외 메시지 확인하기(예외가 발생한 이유)
      System.out.println(e.getMessage());
    }
  }
  public static void ex02(String name) {
   
    try { 
     
      System.out.println(name.substring(0, 1));
     
    } catch (Exception e) {
     
      e.printStackTrace();  // 예외 추적 메시지를 출력하는 메소드 (개발 중에는 이것만 사용한다.)
    }
  }

profile
개발이 세상에서 제일 재밌어요

0개의 댓글

관련 채용 정보