[230801] 예외처리 (DAY25)

MJ·2023년 8월 2일

수업 TIL🐣💚

목록 보기
26/68

Error와 Exception

  1. Error
  • 시스템 레벨의 심각한 오류
  • 시스템 수정으로 문제를 해결
  1. Exception
  • 프로그램 레벨의 일반적인 오류
  • 코드 수정으로 문제를 해결

예외(Exception)

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

종류

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(예외 타입 선언) {
	④ 예외 처리 코드
}try - catch 이후 코드

예외 흐름

①→②→④→⑤ 순으로 진행

try {
	① 정상 실행 코드
	② 예외 발생 코드
	③ 정상 실행 코드
} catch(예외 타입 선언) {
	④ 예외 처리 코드
}try - catch 이후 코드

다중 catch 블록

  • 하나의 try 블록에 여러 개의 catch 블록이 추가될 수 있음
  • try 블록에서 발생된 예외는 우선 첫 번째 catch 블록을 방문함
  • 첫 번째 catch 블록이 처리하지 못하면 다시 두 번째 catch 블록을 방문함

finally 블록

  • try - catch문 마지막에 추가할 수 있는 블록
  • 예외 발생 여부와 상관 없이 항상 마지막에 실행되는 블록
  • 필요 없는 경우 finally 블록은 생략할 수 있음
  • 주로 어떤 자원을 반납(close)할 때 사용
try {
실행 코드
} catch(예외 타입 선언) {
예외 처리 코드
} finally {
무조건 실행되는 코드
}

throw

  • 개발자가 직접 예외를 던지는 경우에 사용
    - 자바는 예외로 인식하지 못하지만 실제로는 예외인 경우 개발자가 직접 예외를 발생시켜서 던짐
  • 개발자가 직접 예외를 발생시킬 때는 RuntimeException을 사용하는 경우가 일반적임
  • 개발자가 직접 만든 예외클래스를 던지는 것도 가능함

throws

  • 메소드에서 예외를 처리하는 방식
      1. 메소드 내부에 try-catch문을 두고 직접 처리하는 방식
      1. 메소드 외부로 예외를 던져서 메소드를 호출하는 곳에서 try-catch문으로 처리하는 방식
  • 메소드 외부로 예외를 던질 때 throws문을 이용해 던지는 예외를 명시함
  • 2개 이상의 예외를 명시할 수 있기 때문에 throw가 아닌 throws라고 함
  public BreadChange sell(int count, int money) throws RuntimeException {

    // 0 이하의 빵을 요청하다
    if (count <= 0) {
      throw new RuntimeException("판매불가합니다 ( 0이하의 빵 요청)");
    ...
    }

sell에서 BreadChange로 예외 던지고

  public BreadChange(int bread, int change) throws RuntimeException {... }

BreadChange도 받은 예외 다시 던지고

public static void main(String[] args) throws RuntimeException { ... } 

main이 예외 던지면 java가 예외처리


0개의 댓글