Java/모두의 자바

Chapter 09-50 Exception 발생시키기

계란💕 2022. 2. 11. 22:50

09-50.1 throw

 

  - 강제로 오류를 발생시킨다. 

  - 보통 오류를 떠넘기는 throws와 같이 쓰인다. 

 

  Ex 1) 

<hide/>
package javaStudy;
public class ExceptionExam3 {
	public static void main(String[] args) {
		int i = 10;
		int j = 0;
		int k = divide(i, j);
		System.out.println(k);
	}
	public static int divide(int i, int j) {
		
		int k = i / j;
		return k;
	}
}

  Note) 실행결과

  - 이 코드는 Exception이 발생한다. 

  - j가 0으로 전달되기 때문이다. 

  - 다음 예제에서 매개변수의 값이 잘못 전달되지 않도록 나눗셈하기 전에 점검하도록 구현한다.

 

  Ex 2) 

<hide/>
package javaStudy;
public class ExceptionExam3 {
	public static void main(String[] args) {
		int i = 10;
		int j = 0;
		int k = divide(i, j);
		System.out.println(k);
	}
	public static int divide(int i, int j) {
		if(j == 0) {
			System.out.println("두 번째 매개 변수는 0이면 안 됩니다. ");
			return 0;
		}
		int k = i / j;
		return k;
	}
}

   Note) 실행 결과

  - j = 0 일 경우 에러 발생하므로 j가 0이면 안된다든 메시지를 출력하고 0을 반환하도록 코드 작성했다.

  - 실행결과 메시지도 출력했으나 0도 출력된다.

  - 메시지를 출력하면서 리턴한 0이라는 값이 k라는 변수에 들어가고 k출력하라는 명령으로 0을 출력한다.  

  - 에러가 발생했으니 실행을 중단하려 했는데 리턴을 0으로 했기 때문에 k결과로 0이라는 값이 나왔다. 

  - 0으로 나눈 결과가 0은 아니니 이는 잘못된 것이다. 

  - 이대로 프로그램을 실행하면 k가 잘못된 값을 가진 것을 모르고 이 값을 계속 사용해서 결과 잘못 나올 수 있다.

  - 이 경우, 직접 오류를 발생시키는 방법잉 있다. 

 

  Ex 3)

<hide/>
package javaStudy;
public class ExceptionExam3 {
	public static void main(String[] args) {
		int i = 10;
		int j = 0;
		int k = divide(i, j);
		System.out.println(k);
	}
	public static int divide(int i, int j) throws IllegalArgumentException {
		if( j == 0 ) {
			throw new IllegalArgumentException("0으로 나눌 수 없습니다");
		}
		int k = i / j;
		return k;
	}
}

  - throw new 로 Exception을 발생시킨다. 

  - throw new IllegalArgumentException("0으로 나눌 수 없습니다"); 

    -> new연산자로 IllegalArgumentException이라는 객체를 만든다. 

    ->  new앞에 throw키워드는 해당 라인에서 Exception이 발생한다는 의미이다. 

    -> 즉, 그 줄에서 "0으로 나눌 수 없습니다. "라는 에러가 발생했다는 것이다. 

    -> Exception 클래스명을 보면 Argument가 잘못 됐기 때문에 발생한 에러이다. 

  - 발생한 Exception에 대해 메서드 호출한 쪽에서 처리하도록 한 경우이다.

  - 해당 에러는 divide 메서드를 호출한 쪽에서 처리하면 된다. 

 

  Ex 4) 발생한 Exception을 try-catch문을 이용해서 Exception 처리한 경우 

<hide/>
package javaStudy;
public class ExceptionExam3 {
	public static void main(String[] args) {
		int i = 10;
		int j = 0;
		try {
			int k = divide(i, j);
			System.out.println(k);
		}catch(IllegalArgumentException e) {
			System.out.println(e.toString());
		}
	}
	public static int divide(int i, int j) throws IllegalArgumentException {
		if( j == 0 ) {
			throw new IllegalArgumentException("0으로 나눌 수 없습니다");
		}
		int k = i / j;
		return k;
	}
}

  Note) 실행 결과

 

09-50.2 Exception 발생시키기 실습

 

  ExceptionExam클래스의 get50thItem 메서드는 매개변수로 받은 array의 50번째 값을 리턴한다. 만약 array의 크기라 50보다 작은 경우에는 0을 리턴한다. 0을 리턴하는 대신 IllegalArgumentException을 throw하도록 코드 수정하라. 

 

  수정 전)

<hide/>
package javaStudy;
public class ExceptionExam {
	public int get50thItem(int [] array) { 
		if(array.length < 50) {
			return 0;
		}
		return array[49];
	}
}
<hide/>
package javaStudy;
public class ExamExam {
	public static void main(String[] args) {
		ExceptionExam ex = new ExceptionExam();
		int [] array = null;
		array = new int[50];
		array[49] = 100;
		System.out.println("array 배열의 50번째 요소의 값: " + ex.get50thItem(array));	
		array = new int[49];
		array[48] = 100;
		System.out.println("array 배열의 50번째 요소의 값: " + ex.get50thItem(array));
		
	}
}

 

 

  수정 후)

<hide/>
package javaStudy;
public class ExceptionExam {
	public int get50thItem(int [] array) throws IllegalArgumentException{
		if(array.length < 50) {
			throw new IllegalArgumentException();
		}
		return array[49];
	}
}

  Note) 실행 결과

  - 원하는 조건으로 예외를 발생시키려면 throw키워드를 이용해 객체를 생성하면 된다.

  - 자바 언어가 자체적으로 제공하는 예외는 일반적인 예외이다. 

  - 숫자를 입력해야하는데 숫자가 아닌 값을 입력하는 것처럼 일반적인 경우에만 예외가 발생한다. 

  - 하지만 사용자는 그런 일반적인 경우가 아니더라고 예외를 발생시키고 싶은 경우가 있다.

  - 예를 들어, 1~100 사이의 숫자만 입력 받는 다던가 지금처럼 배열의 크기가 50보다 작으면  예외 발생시키는 것처럼.

  - 이런 경우 자바가 알아서 발생시킬 수는 없으니 사용자가 원하는 경우 강제로 예외를 발생시킨다.

  - 문제를 보면 get50thItem메서드를 호출하면 인자로 들어온 배열 크기를 확인하고 50보다 작으면 0을 리턴한다.

  - 그런데 0을 리턴하면 진짜 50번째 값이 0인지 배열의 길이가 50보다 작은건지 모호해진다.

  - 이럴 때 "throw"를 이용해서 사용자가 예외를 직접 발생시킨다. 

  - 문제에서 Exception처리는 언급이 없으므로 메서드 선언부 뒤쪽에 throws IllegalArgumentException을 추가하면

  - 해당 예외를 던져준다. 

  - 이렇게 실행하면 배열크기가 조건에 맞을 때는 50번째 값은 리턴하도 그렇지 않을 때는 예외를 발생시킨다.