jujuwon
시크릿주주
jujuwon
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • 🔠 프로그래밍언어 (35)
      • ☕️ Java (19)
      • 🐠 Python (15)
      • 🍠 Kotlin (1)
    • 🔙 Backend (16)
      • 🌿 Springboot (12)
      • 🐳 Docker (1)
      • ☁️ AWS (3)
    • 💼 CS (12)
      • 📶 Network (12)
    • 🕹 알고리즘 (14)
      • 📑 스터디 (2)
      • 💁🏻‍♂️ 백준 (9)
      • 👨🏼‍🔬 프로그래머스 (3)
    • 📚 Book (8)
      • 🔎 오브젝트 (4)
      • 🧪 TDD (2)
      • 📜 논문 (2)
    • 🔐 보안 (7)
      • 👾 Pwnable (7)
    • 📝 회고 (4)
    • 🧩 etc. (10)
      • ⚠️ issue (2)
      • 💡 꿀팁 (7)
      • ✏️ 끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
jujuwon

시크릿주주

Java :: 예외 처리
🔠 프로그래밍언어/☕️ Java

Java :: 예외 처리

2022. 12. 15. 01:10
반응형

 

프로그램 오류


프로그램 오류의 종류

  • 컴파일 에러 : 컴파일할 때 발생하는 에러
  • 런타임 에러 : 실행할 때 발생하는 에러
  • 논리적 에러 : 사용자의 작성 의도와는 다른 동작 수행

예외처리 정의와 목적


Java 의 런타임 에러 - 에러(Error)와 예외(Exception)

  • 에러 (Error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • 예외 (Exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

예외처리 정의와 목적

  • 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성
  • 목적 : 프로그램의 비정상 종료를 막고, 정상 실행상태를 유지하는 것

예외 클래스의 계층구조

  • RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외
  • Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

예외처리구문 try-catch

try {
    // 예외가 발생할 가능성이 있는 문장 기입
} catch(Exception1 e1) {
    // Exception1 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
} catch(Exception2 e2) {
    // Exception2 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
} catch(Exception3 e3) {
    // Exception3 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
} catch(ExceptionN eN) {
    // ExceptionN 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
}
  • try 블럭 내에서 예외가 발생하지 않으면, catch 블럭을 거치지 않고 빠져나옴
  • try 블럭 내에서 예외가 발생한 경우
    • 발생한 예외와 일치하는 catch 블럭이 있는지 확인
    • 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내 문장들을 수행하고
      전체 try-catch 문을 빠져나가서 그 다음 문장 계속 수행
      만일 일치하는 catch 블럭을 찾지 못하면 예외는 처리되지 못함

예외 객체에 대한 메소드

  • 발생한 예외 객체를 catch 블럭의 참조변수로 접근할 수 있음
    • printStackTrace() : 예외가 발생할 때 호출스택 (Call Stack) 에 있었던 예외 메시지와
      메소드의 정보를 화면에 출력
    • getMessage() : 예외 클래스 인스턴스에 저장된 메시지를 획득

finally 블럭

  • 예외의 발생여부와 관계없이 실행되어야 하는 코드를 넣음
  • 선택적으로 사용할 수 있으며 try-catch-finally 순서로 구성
    • 예외 발생 시, try-catch-finally 순서로 실행됨
    • 예외 미발생 시, try-finally 순서로 실행됨
  • try 또는 catch 블럭에서 return 문을 만나도 finally 블럭은 수행됨
try {
    ...
} catch(Exception e) {
    ...
} finally {
    // 예외 발생유무와 관계없이 항상 수행하는 문장을 기입
    // finally 블럭의 위치는 try-catch 문의 마지막 부분
}

예외 발생시키기

  • 예외 클래스 객체 생성 Exception e = new Exception(”예외 발생”);
  • 키워드 throw 를 이용해서 예외를 발생시킴 throw e;
try {
    Exception e = new Exception("예외 발생");
    throw e;
    // throw new Exception("예외 발생");
} catch(Exception e) {
    e.printStackTrace();
    System.out.println("에러 메시지 : " + e.getMessage());
}

메소드에 예외 선언하기

  • 예외를 처리하는 방법
    • 직접 처리 : try-catch 문으로 예외 처리
    • 간접 처리 : 예외 선언 (예외 전달)
  • 메소드를 호출할 때 예외를 처리하는 것이 아니라, 호출한 메소드로 전달해주는 것
  • 호출한 메소드에서 예외처리를 해야만 할 때 사용
public static void main(String[] args) throws Exception {
    method1();
}

static void method1() throws Exception {
    method2();
}

static void method2() throws Exception {
    throw new Exception();
}

메소드에서 예외를 던지는 경우 throws !

향상된 예외처리 (try-with-resources)

  • try 코드 블럭이 끝난 이후 자동으로 자원을 해제해주는 기능
    • finally 블럭이나 모든 catch 부분에 자원 해제를 처리해주지 않아 편리함
  • 사용한 자원을 정상적으로 해제해주지 않고 사용하게 된다면?
    • 메모리 Leak 으로 프로그램이 멈춤

향상된 예외처리 사용 전

FileInputStream fileInputStream = null;

try {
    fileInputStream = new FileInputStream("파일.txt");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fileInputStream != null) {
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

finally 에서 FileInputStream 을 썼는지 확인하고 해제해줘야 함.

향상된 예외처리 사용 후

FileInputStream fileInputStream = null;

try (fileInputStream = new FileInputStream("파일.txt")) {

} catch (IOException e) {
    e.printStackTrace();
}

예외가 발생하면 JVM 이 자동으로 close 를 호출해서 자원을 반납해준다 !

훨씬 간결하게 코드를 작성할 수 있다.

  • 물론 모든 걸 적용할 수 있는 건 아니고, 이 객체가 AutoCloseable 인터페이스를 구현한 객체여야 함 !
  • AutoCloseable 이 적용되어 있지 않다면 ?
    • 상속 받아서 void close() throws Exception; 만 구현해주면 됨 !

 

728x90
반응형
저작자표시 (새창열림)
    '🔠 프로그래밍언어/☕️ Java' 카테고리의 다른 글
    • Java :: 어노테이션(Annotation)
    • Java :: 열거형 - Enumeration
    • Java :: 팩토리(Factory) 메소드 패턴
    • Java :: 싱글톤(Singleton) 패턴
    jujuwon
    jujuwon

    티스토리툴바