[java] 예외 처리

한지개·2023년 2월 15일

java

목록 보기
7/9

예외란?

프로그래머가 직접 예측하여 막을 수 있는 처리가능한 오류. 만일 응용프로그램이 예외에 대처하는 코드를 가지고 있지 않다면, 자바 플랫폼은 응용프로그램을 곧바로 중단 시킴.

예외 발생 사례

Scanner scanner = new Scanner(System.in);

int a = scanner.nextInt(); // 나뉨수 입력
int b = scanner.nextInt();// 나눔수 입력
int c = a/b;

System.out.println(a+"를 "+b+"로 나누면 몫은 "+c+"입니다.");

실행 결과(0이 아닌 수로 나눴을 때)

실행 결과(0으로 나눴을 때)

  • 사용자가 나누는 수에 0을 입력하면 ArithmeticException 예외가 발생함.
  • 위 프로그램은 이 예외에 대한 대처 코드가 없기 때문에 자바 플랫폼에 의해 강제 종료됨.

사용자가 0을 임력하는 예외 상황은 컴파일 시에 미리 걸러낼 수 없지만, 예외가 발생할 때 응용프로그램이 이에 적절히 대응하여 강제 종료되지 않고 사용자의 입력을 다시 받는 별도의 조치를 취할 수 있음. -> 예외 처리


예외 처리

1) try-catch-finally 문

사용법

try {
	// 예외가 발생할 가능성이 있는 실행문(try 블록)
}
catch (처리할 예외 타입 선언) {
	// 예외 처리문(catch 블록)
}
finally {
	// 예외 발생 여부오 상관없이 무조건 실행되는 문장(finally 블록)
}
  • 예외가 발생할 가능성이 있는 실행문들을 try {} 블록으로 묶고, 예외 처리 코드는 catch {} 블로 내에 작성함.
  • catch() 문의 () 안에는 처리하곶 하는 예외의 타입을 선언함.
  • catch {} 블록은 예외마다 하나씩 작성되어야 함.
  • finally {} 블록은 생략해도 상관없고, 예외가 발생하든 않든 마지막에 반드시 실행됨.

예외가 발생되지않은 경우

try {
	// 실행문
}
catch (처리할 예외 타입 선언) {
	// 예외 처리문
}
finally {
	// finally 블록문
}

실행문 -> finally 블록문

예외가 발생된 경우

try {
	// 실행문
}
catch (처리할 예외 타입 선언) {
	// 예외 처리문
}
finally {
	// finally 블록문
}

예외 처리문 -> finally 블록문


실행 예시

int[] intArray = new int[3] {0, 1, 2};

try {
	System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
	System.out.println("ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (ArithmeticException e) {
	System.out.println("ArithmeticException: " + e.getMessage());
} finally {
    System.out.println("일단 실행하기.");
}

  • intArray 배열의 범위를 벗어났기 때문에 catch(ArrayIndexOutOfBoundsException e) 예외 처리문 실행됨.
  • finally() 는 예외 상황이든 아니든 실행됨.

자바의 예외 클래스

예외 타입예외 발생 경우
ArithmeticException정수를 0으로 나눌 때 발생
NullPointerExceptionnull 레퍼런스를 참조할 때 발생
ClassCastException변환할 수 없는 타입으로 객체를 변환할 때 발생
OutOfMemoryError메모리가 부족할 경우 발생
ArrayIndexOutOfBoundsException배열의 범위를 벗어난 접근 시 발생
IllegalArgumentException잘못된 인자 전달 시 발생
IOException입출력 동작 실패 또는 인터럽트 시 발생
NumberFormatException문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환시 발생
InputMismatchExceptionScanner 클래스의 nextInt()를 호출하여 정수로 입력받고자 하였지만, 사용자가 'a' 등과 같이 문자를 입력한 경우

2) throws
throws는 자신을 호출하는 메소드에 예외처리의 책임을 떠넘김.

public static void main(String[] args) {
	int a = 12;
	int b = 0;

	try {
		divide(a, b);
	} catch (ArithmeticException e) {
		System.out.println("ArithmeticException: " + e.getMessage());
	}
}

public static void divide(int a, int b) throws ArithmeticException{
	System.out.println("throw a/b: "+ a/b);
}

  • divid() 메소드는 a와 b를 나눈 후 출력하는 역할을 하는데, b가 0일 경우 예외가 발생함. 그래서 try-catch로 예외 처리를 해야하지만, divide()를 호출한 곳에서 예외가 발생한 다음의 처리를 divide() 메소드가 정하지 않기 때문에 divide() 메소드를 호출한 main() 에 던짐(throw).
  • 반드시 try-catch 구문으로 메소드 호출 부분을 감싸야함.

3) throw
throw는 개발자가 직접 예외를 발생시키고 싶을 때 씀.

나중에 추가할래...

profile
평생 소원이 누룽지

0개의 댓글