Day 39

ChangWoo·2023년 5월 14일
0

자바의 정석

목록 보기
39/71
post-thumbnail

ch 8-11~14 메서드에 예외 선언하기, finally블럭

메서드에 예외 선언하기

예외를 처리하는 방법 : try-catch문(=직접 처리), 예외 선언하기(=예외 떠넘기기 또는 알리기), 은폐(덮기 / 빈 catch블럭을 추가하는 것)
메서드가 호출시 발생가능한 예외를 호출하는쪽에 알리는 것

  • 메서드 + throws + 예외
  • 예외를 발생시킬 때는 throw / 메서드에 예외 선언할 때는 throws
  • Exception은 모든 예외의 최고 조상이므로 모든 종류의 예외가 발생 가능하다.
  • 비록 위의 예외가 3개 밑의 예외가 1개로 적어보이지만, Exception이 모든 예외의 최고 조상이므로 더 많다.
  • 본인이 호출한 메서드에 예외를 알려준다.
  • Java API문서에서 wait 메서드를 찾은 경우로, Throws를 보면, 2가지 예외가 발생할 수 있음을 말하고 있다.
  • 발생할 수 있는 예외가 2개면 throws를 통해 2개 모두 선언해줘야 하는데, 위의 경우 InterruptedException 하나만 선언했다. -> IllegalMonitorStateException이 RuntimeException으로 예외처리가 선택이기 때문이다.
  • InterruptedException은 Exception으로 예외처리가 필수적

메서드에 예외 선언하기 - 예제1

  • main 메서드가 method1을 호출 , method1이 method2를 호출, method2가 Exception을 호출
  • method2가 method1에게 예외를 떠넘긴다.
  • method1도 main에게 예외를 떠넘기지만, main은 try-catch가 없으므로 비정상종료된다.
  • main, method1, method2 중 어느 한 곳이라도 try-catch가 있다면 오류가 발생하지 않는다.

메서드에 예외 선언하기 - 예제2

  • args[0] = test2.txt
  • test2.txt라는 이름으로 파일을 생성
  • main에서 createFile 호출 -> 파일명이 null 혹은 ""가 아닐 경우 파일 생성 후 try로 리턴해서 "파일이 성공적으로 생성되었습니다."를 출력
  • main에서 createFile 호출 -> 파일명이 null 혹은 ""가 일 경우 "파일이름이 유효하지 않습니다."를 출력하고 catch문으로 가서 "다시 입력해 주시기 바랍니다."를 출력

finally블럭

예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.

  • try-catch문 마지막에 finally를 넣는다.
  • finally는 예외가 발생하거나 발생하지 않거나 수행되어야 하는 코드를 넣는다.
try {										try {
	startInstall();								startInstall();
    copyFiles();								copyFiles();	
    deleteTempFiles(); // 임시파일 삭제		} catch (Exception e) {	
} catch (Exception e) {					-->		e.printStackTrace();		
	e.printStackTrace();				    } finally {
    deleteTempFiles(); // 임시파일 삭제			deleteTempFiles();
} // try-catch의 끝						  } // try-catch의 끝
  • 설치하고 파일을 복사한 후, 설치가 완료되면 임시파일 삭제, 설치 중 예외가 발생해도 임시파일 삭제를 해야하는데, 코드가 중복된다.
  • 그래서 코드의 중복을 제거하기 위해 finally 블럭이 생겼다.

ch 8-15~17 사용자 정의 예외 만들기, 예외 되던지기

사용자 정의 예외 만들기

우리가 직접 예외 클래스를 정의할 수 있다.
조상은 Exception과 RuntimeException중에서 선택

class MyException extends Exception {
	MyException(String msg) {  // 문자열을 매개변수로 받는 생성자
    		super(msg);	// 조상인 Exception클래스의 생성자를 호출한다.
    }
}
  • Exception = 사용자가 발생시키는 예외
  • RuntimeException = 프로그래머의 실수로 발생시키는 예외
  • 그런데, Exception은 필수처리 / RuntimeException은 선택처리이므로 가능하면, RuntimeException을 사용
  • 조상은 Exception과 RuntimeException중에서 선택해야 한다.
  • String 매개변수를 넣어주어야 한다.

예외 되던지기(exception re-throwing)

예외를 처리한 후에 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것

  • 예외가 발생해서 try-catch처리를 하였는데, 다시 예외를 발생시킨다.
  • 밑에서 처리를 하였는데 다시 예외를 발생시켰으므로, 위에서 다시 한번 더 try-catch처리한다.(양쪽 처리)
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글