본문 바로가기

Java

Java 예외처리(exception handling)

1. 에러의 종류

1) 컴파일 에러(compile-time error): 컴파일 시 발생

2) 런타임 에러(runtime error): 실행 시 발생

3) 논리적 에러(logical error): 실행은 되지만 의도와 다르게 동작

 

cf) 컴파일러의 역할

1. 구문체크

2. 번역

3. 소스 코드 최적화

4. 생략된 코드 추가( extends Object 같이 원래 넣어야하지만 컴파일러가 해줘서 안넣는 것들)

 

2. Java의 런타임 에러

실행(runtime) 시점에서 발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception)로 구분

 

1) 에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류(메모리 부족, 스택오버플로우 등)

2) 예외(exception): 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

 

 

3. 예외처리(exception handling)

정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드 작성

목적: 프로그램의 비정상 종료를 막고 정상적인 실행 상태 유지

 

 

4. 예외 클래스의 계층 구조

 

 

Exception: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

checkeException: 컴파일러가 예외 처리 여부를 체크(예외 처리 필수)

RuntimeException: 프로그래머의 실수로 발생하는 예외

Unchecked Exception: 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)

 

 

✍🏻스프링 예외 공부 했던거 참고하기! 스프링으로 예외라고 했지만 결국 근본(?)은 자바의 예외처리인 것... !

 

5. 예외 처리하기 - try~catch 문

1) try~catch 로 예외처리

try {
    // 예외 발생 가능성이 있는 문장    
} catch (Exception1 e1) {
    // Exception1 발생한 경우, 예외 처리할 문장
} catch (Exception2 e2){
    // Exception2 발생한 경우, 예외 처리할 문장
} catch (ExceptionN eN){
    // Exception3 발생한 경우, 예외 처리할 문장
}

* if문이나 for문은 블럭내 포함된 문장이 하나인 경우 괄호 {} 생략이 가능하나 try~catch 블럭은 생략 불가

 

2) try~catch 흐름

- try 블럭 내에서 예외가 발생한 경우1

발생한 예외와 일치하는 catch 블럭 찾음 -> 일치하는 catch 블럭이 있는 경우, 그 문장을 수행 -> try~catch문을 빠져나감

 

- try 블럭 내에서 예외가 발생한 경우2

발생한 예외와 일치하는 catch 블럭 찾음 -> 일치하는 catch 블럭이 없는 경우 -> 예외처리X

 

- try 블럭 내에서 예외가 발생하지 않은 경우

catch블럭을 거치지 않고 try~catch문을 빠져나감

class Ex8_4 {
	public static void main(String args[]) {
		System.out.println(1);			
		System.out.println(2);
		try {
			System.out.println(3);
			System.out.println(0/0); // 예외 발생
			System.out.println(4); 	// 실행되지 않음
		} catch (ArithmeticException ae)	{
			if (ae instanceof ArithmeticException) 
				System.out.println("true");	
			System.out.println("ArithmeticException");
		} catch (Exception e){ // Exception은 모든 예외 클래스의 조상이므로 어떤 종류의 예외가 발생해도 처리 가능! 그러니까 제일 마지막 catch블럭에 Exception!
			System.out.println("Exception"); //
		}	// try-catch 끝 
		System.out.println(6);
	}	// main 메서드 끝
}

 

 

6. printStackTrace()와 getMessage()

printStackTrace(): 예외발생 다시 호출 스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지 출력 

getMessage(): 발생한 예외 클래스 인스턴스에 저장된 메시지 얻을 수 있음

 

* 예외 클래스에는 더 많은 메서드가 있는데  자주 사용하는 메서드 2개 pringStackTrace(), getMessage() 일단 학습

 

7. 멀티 catch 블럭

- 내용이 같은 catch 블럭을 하나로 합친 것(JDK 1.7 부터)

try {
...
} catch (ExceptionA | ExceptionB | ExceptionC) {
	e.printStackTrace();
}

- 예외가 부모 자식 관계인 경우 부모 예외 클래스만 작성하기!(부모-자식 예외 다 쓰는 경우 컴파일 에러 발생)

-  나열된 예외의 공통 메서드만 작성 가능!(너무 당연한 것..!)

- 굳이! 그렇게 처리를 해야한다면 if~else문으로 특정 메서드 호출 처리(이렇게 쓰지 않기!!)

 

8. 고의로 예외 발생시키기

// 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체 생성
Exception e = new Exception("고의로 예외 발생시키기");

// 키워드 throw를 이용해서 예외 발생시킴
thow e;


class Ex8_6 {
	public static void main(String args[]) {
		try {
			Exception e = new Exception("고의로 예외 발생 시킴");
			throw e;	 // 예외 발생시키기
		//  throw new Exception("고의로 예외 발생 시킴"); // 위 2줄 1줄로 작성하기

		} catch (Exception e)	{
			System.out.println("에러 메시지 : " + e.getMessage());
			e.printStackTrace();
		}
		System.out.println("프로그램 정상 종료");
	}
}

 

'Java' 카테고리의 다른 글

Java Object 클래스  (0) 2022.12.29
Java 예외처리(exception handeling)2  (0) 2022.12.29
Java 내부 클래스(inner class)  (0) 2022.12.29
Java default 메서드와 static 메서드  (0) 2022.12.29
Java 인터페이스(interface)  (0) 2022.12.28