동동 개발

자바의 예외처리 본문

Java 공부

자바의 예외처리

양동선 2023. 12. 18. 15:49

예외 (Exception) 처리

  • 예외 : 실행 중 발생한 오류
  • 예외 발생
    • 예외(exception)가 던져졌다(thrown)고 표현
    • JVM이 예외 감지, 응용프로그램에게 예외 객체(exception object)를 던짐
  • 예외 처리 (exception handling)
    • 던져진 예외 객체를 받아서(catch) 적절한 작업 수행
    • try-catch-finally문 사용

 

try-catch-finally문

  • try, catch : 반드시 있어야함
  • finally : 생략가능

 

자바의 예외 클래스

  • ArithmeticException
  • NullPointerException
  • ClassCastException
  • OutofMemoryError
  • ArrayIndexOutOfBoundsException
  • IllegalArgumentException
  • IOException
  • NumberFormatException
  • InputMismatchException

예시 : InputMismatchException

package week09final;
import java.util.Scanner;
import java.util.InputMismatchException;

public class prac03_17 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("정수 3개 입력하세요.");
		int sum = 0, n =0;
		for(int i=0; i<3; i++) {
			try {
				System.out.print(i+">>");
				n = scanner.nextInt();
				sum +=n;
			}catch(InputMismatchException e) {
				System.out.println("정수가 아닙니다. 다시 입력하세요.");
				scanner.next();
				i--;	
			}
		}
			System.out.println("합은 "+sum);
			scanner.close();
	}
}

 

 

throws : 예외 던지기

  • 실행 중에 발생한 예외를 호출한 쪽에 던짐
  • throws : 메소드가 던질 수 있는 예외를 명세

 

Unchecked exceptions VS Checked exceptions

  • Unchecked exception
    • 컴파일러가 예외 대응 여부를 검사하지 않음 -> 컴파일 오류 발생 안함
  • Checked exception 
    • RuntimeException 클래스와 하위 클래스 (Exception 클래스 포함)
    • 예외를 catch하거나 throws 선언을 해야함. -> 컴파일 오류 발생

 

Throwable 클래스

  • java.lang 패키지에 속함
  • 모든 예외와 오류 클래스의 상위 클래스
    • 예외 객체의 속성과 기능을 정의
  • 주요 속성 
    • 메시지
    • stack trace : 당시의 스택상태 
  • 주요 기능
    • toString
    • getMessage
    • printStackTrace
    • getStackTrace

 

예외 객체

  • Exception 클래스
    • java.lang 패키지
    • Throwable 클래스의 하위 클래스
  • 예외 객체
    • 예외 클래스의 인스턴스
    • new Exception(), new ArithmeticException(), ...
    • 메시지는 생성자의 인자로..
      • ex) new Exception("test exception");

 

Stack unwinding (스택 되감기)

  • 예외가 발생하였으나, catch 되지 않은 경우
  • 예외가 바깥 쪽 try 블록으로 던져짐
  • 현재 메소드에서 처리가 안되면 호출한 쪽으로 예외를 던지고, 현재 메소드 종료
package week09final;

public class Rethrow {

	public static void main(String[] args) {
		try {
			f();
		}catch(Exception ex) {
			ex.printStackTrace();
		}
		System.out.println("This is main.");
	}
	
	static void f() throws Exception{
		try {
			g();
		}catch(Exception ex){
			System.out.println("exception caught in f()");
			throw ex;
		}
			
	}
	
	static void g() throws Exception{
		throw new Exception("Exception in g()");
        //try catch문 없음, 여기서 처리 안하겠다. --> 스택 되감기
	}
}

 

 

Chained Exception (연결된 예외 객체)

  • catch한 예외 객체를 새로운 예외 객체에 연결
  • 예외 객체 연결을 위한 생성자
    • new Exception(이전 예외 객체)
    • new Exception(메세지, 이전 예외 객체)