유블로그

[Java] 예외(Exception) 본문

Java

[Java] 예외(Exception)

yujeong kang 2020. 8. 11. 15:26

[예외]

- 예기치 않은 일의 발생
- try, catch, finally, throws, throw

- 예외 클래스
- 처리하는 방식에 따른 구분 : 간접처리 방식(throws)과 직접처리 방식(try, catch, finally)으로 구분
- 발생하는 시점에 따른 구분 : 컴파일 시점에 발생(checked exception), 런타임 시점에 발생(unchecked exception)
- 자바에서 예외는 모두 클래스로 정의되어 있다.
  : ~Exception
  
      <예외 클래스 계층구조>
  :                               Object
                                  
  :                           Throwable (에러 중 최상위 클래스. 예외정보들을 가지고 있음)
                               ↓      ↓
  :                  Exception       Error
                    ↓         ↓
  :RuntimeException    그외..
  
   코드 작성 때는 아무 문제 없었는데 동작시킬 때 exception 뜨면 RuntimeException 이다.

  : 사용자가 정의하는 예외
  : 예외 클래스 직접 정의 -> 예외 클래스 상속받기  
  : (RuntimeException 계열을 상속받으면 런타임 발생 예외가 됨)
  : (RuntimeException 계열이 아닌 예외 클래스를  상속받으면 컴파일 시점 발생 예외가 됨)

 

 

< 직접 exception 정의하기(jvm 은 exception 인 지 알지 못하지만 개발자 입장에서 exception 일 때 사용) >

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Random;
import java.util.Scanner;

/*
	예외 클래스 직접 정의하기
	
	class 이름  extends 예외클래스
	
	class MyException extends Exception			: 컴파일 시점 체크 예외 
	class MyException extends RuntimeException 	: 런타임 시점 예외
	
	JVM 이 알고있는 예외 상황이 아닐 경우 개발자가 직접 예외상황 위치에서 예외를 발생시켜야 한다.
	- throw : 예외를 직접 발생시킨다.
	  throw 예외객체, throw new 예외클래스타입();
	
 */

class LottoNumberException extends Exception {
	public LottoNumberException() {
		// Exception(String msg) 생성자 사용
		super("로또번호는 1부터 45 사이의 숫자만 가능합니다.");		// 에러메세지 등록
	}
}

public class Test {
	public static void main(String[] args) {
		try {
//			Scanner sc = new Scanner(new File("a.txt"));
			a();
		} catch(LottoNumberException e) {
			System.out.println("에러메세지 : " + e.getMessage());	// 간단한 에러 메세지
			e.printStackTrace();	// 상세한 에러 메세지 
		} 
//		catch(FileNotFoundException e) {
// 			밑에건 자바 내장 exception 이므로 message가 있으므로 LottoNumberException 에도 내가 직접 에러 메세지를 넣을 수 있다.
//			System.out.println("에러메세지 : " + e.getMessage());	
//			e.printStackTrace();
//		}
	}
	
	public static void a() throws LottoNumberException {	// throws LottoNumberException 적어주는 이유 : 코드 보는 사람이 여기서 에외 발생할 수 있다는 것 알게 하기 위해서
		
		Random r = new Random();
		int num = r.nextInt(100);	// 0~99까지 나옴.
		
		// 1부터 45 사이의 번호가 아닐 경우 예외를 발생시킨다.
		if(num == 0 || num > 45) {
			// 예외 발생 시키기
			// 만약 a() 뒤에 throws LottoNumberException 안적고 위에서 LottoNumberException class 정의 때extends Exception 이라고 해놓으면 예외처리 안 했다고 에러 발생
			throw new LottoNumberException();		// throw Exception 쓰려면 throws 해줘라~
		}
		
		System.out.println("발생된 번호 : "+ num);
	}
}

'Java' 카테고리의 다른 글

[Java] final  (0) 2020.08.12
[Java] Abstract, Interface  (0) 2020.08.12
[Java] Iterator  (0) 2020.08.11
[Java] Collections (+Generic)  (0) 2020.08.11
[Java] Inner class  (0) 2020.08.10