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번째 값은 리턴하도 그렇지 않을 때는 예외를 발생시킨다.
'Java > 모두의 자바' 카테고리의 다른 글
Chapter 08-44 인터페이스 사용하기 (0) | 2022.02.12 |
---|---|
Chapter 09-51 사용자 정의 Exception (0) | 2022.02.12 |
Chapter 09-49 Throws (0) | 2022.02.11 |
Chapter 09-48 예외(Exception) (0) | 2022.02.11 |
Chapter 08-47 익명 클래스(anonymous class) (0) | 2022.02.11 |