JAVA_exception handling

0ne·2024년 6월 10일

java

목록 보기
3/11

정의

throwing an exception

unusual한 무언가가 일어났을 때 신호를 보내는 기작

handling the exception

exceptional case를 다루는 코드

1. throws 메서드를 이용하기

pass the buck

예외만 던지는 메서드

  • 해당 메서드는 try, catch블록을 가지고 있으면 안됨; 따라서 throws clause를 사용해 catch를 안함을 나타냄
  • 이 메서드는 try블록 안에서 invoke됨; 해당 try블록을 가진 다른 메서드가 exception handling을 책임짐 즉, throws메서드는 throw만 함
  • 여러개의 exception를 throw할 수 있도록 throws뒤에 여러 exception 타입을 명시할 수 있음

2. try(throw)-catch-finally

try : 정상 흐름!!

i) exception ㄴㄴ

  • try블록 끝까지 실행
  • catch블록 skip
  • catch블록 다음에 있는 코드까지 실행

ii) exception ㅇㅇ

중간에 throw 예외 객체

  • 오류가 발생하면 예외 객체를 만들고 이를 throw함
  • try block 멈춤; 남은 try블록 skip
  • catch block을 call함

catch : 예외 흐름!!

던져진 예외 객체를 인자로 받음

* 메서드 정의는 아님

  • catch블록에서 잡을 수 있는 객체의 타입을 명시함
  • 던져진 exception의 identifier를 정의

multiple catch block

  • 특정 exception 타입만 catch할 수 있으므로 여러 개의 catch 블록은 타당
  • 하지만 순서가 중요하다; Specific이 먼저 오도록!!

finally : 마무리 흐름!!

i) ㄱ. 정상 흐름 ㄴ. finally
ii) ㄱ. 예외 catch ㄴ. finally
iii) ㄱ. 예외 catch 실패 ㄴ. finally ㄷ. method 종료, 밖으로 exception object 던져짐

try를 시작만 해도 finally는 반드시 호출됨

try, catch안에서 잡을 수 없는 예외가 발생해도 finally는 반드시 호출

주로 try에서 사용한 자원을 해제할 때 주로 사용

exception class

predefined exception class

check exception

1) catch 블록에서 포착하거나 2) throws 키워드로 예외 선언을 해야 함

uncheck exception

예외를 잡아서 처리하지 않아도 throws키워드를 생략할 수 있다

package exception.basic.unchecked;
/**
* RuntimeException을 상속받은 예외는 언체크 예외가 된다. */
 public class MyUncheckedException extends RuntimeException {
     public MyUncheckedException(String message) {
         super(message);
     }
}
 package exception.basic.unchecked;
 public class Client {
     public void call() {
         throw new MyUncheckedException("ex");
     }
}
package exception.basic.unchecked;
/**
* UnChecked 예외는
* 예외를 잡거나, 던지지 않아도 된다.
* 예외를 잡지 않으면 자동으로 밖으로 던진다. */
 public class Service {
     Client client = new Client();
/**
* 필요한 경우 예외를 잡아서 처리하면 된다. */
     public void callCatch() {
         try {
             client.call();
         } catch (MyUncheckedException e) {
//예외 처리 로직
System.out.println("예외 처리, message=" + e.getMessage()); }
System.out.println("정상 로직"); }
/**
* 예외를 잡지 않아도 된다. 자연스럽게 상위로 넘어간다.
* 체크 예외와 다르게 throws 예외 선언을 하지 않아도 된다. */
     public void callThrow() {
         client.call();
} }

check exception과 다르게 (예외를 처리할 수 없을 때 밖으로 던지는) throws예외 선언을 컴파일러가 체크하지 않기 때문에 '언체크' 예외이다.

특징

모든 predefined exception class는

String타입을 인자로 받는 생성자를 가짐

해당 인자를 리턴하는 getMessage accessor가 있음

주의점 2가지를 일관되게 사용해야 함

동일한 예외에 대해서는 일관된 방식으로 처리 즉, 특정 예외를 catch 블록에서 처리하지 않으면 throws 키워드로 선언해야 하고, 반대로 catch 블록에서 처리하면 throws 키워드로 선언할 필요가 없어

사용자 정의 exception class

predefined exception class를 상속받아야 함

최소 2개이상의 생성자를 정의해야 함

Public class MyException extends Exception{
	// variables
	public MyException() {
		super("default message");
		//perform other tasks
		}
	public MyException(VariableType var){
		super(var+ "rest of message");
		//perform other tasks
	}
	//other methods if needed
}
  1. 문자열 매개변수를 갖는 생성자: 이 생성자는 super를 호출하여 매개변수를 인자로 사용해야 함
  2. 기본 생성자: 이 생성자는 super를 호출하여 기본 문자열을 인자로 사용해야 함

Exception controlled loops

import java.util.Scanner;
import java.util.InputMismatchException; //unchecked

public class InputMismatchExceptionDemo {
	public static void main(String[] args) {
    	Scanner keyboard = new Scanner(System.in);
        int number = 0;
        boolean done = false;
        
        while (!done) {
        	try {
            	System.out.println("Enter a whole num");
                number = keyboard.nextInt();
                done = true;
            }
            catch (InputMismatchException e) {
            	keyboard.nextline(); //예외가 발생한 후에는 여전히 잘못된 입력이 남아있으므로 이를 소비.
                System.out.println("Not a correclty written whole number");
            }
        }
        System.out.println("You entered " + number);
    }
}
profile
@Hanyang univ(seoul). CSE

0개의 댓글