배열의 요소를 반대로 나열하는 메서드 작성
import java.util.Scanner;
public class ReverseArray1 {
// -- 배열의 요소 a[idx1]와 a[idx2]를 교환 -- //
static void swap(int[] a, int idx1, int idx2) {
int t = a[idx1];
a[idx1] = a[idx2];
a[idx2] = t;
}
// -- 배열 a의 요소를 반대로 나열(오류) -- //
static void reverse (int[] a) {
try {
for(int i=0; i<a.length/2; i++)
swap(a, i, a.length - i);
}catch (NullPointerException e) {
e.printStackTrace();
System.exit(1);
}catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
System.exit(1);
}
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("요소 수: ");
int num = stdIn.nextInt();
int[] x = new int[num];
for(int i=0; i<num; i++) {
System.out.print("x["+i+"]:");
x[i] = stdIn.nextInt();
}
reverse(x); // 배열x의 요소를 반대 순서로 나열
System.out.println("반대로 나열했습니다.");
for(int i=0; i<num; i++) {
System.out.println("x["+i+"]: "+ x[i]);
}
}
}
결과
요소 수: 3
x[0]:1
x[1]:2
x[2]:3
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at TryFirstProjject/package.ReverseArray1.swap(ReverseArray1.java:9)
at TryFirstProjject/package.ReverseArray1.reverse(ReverseArray1.java:17)
at TryFirstProjject/package.ReverseArray1.main(ReverseArray1.java:38)
reverse 메서드는 swap(a, i, a.length-i-1)으로 되어야 하지만, swap(a, i, a.length-i)로 되어있다.
main 메서드로부터 reverse 메서드가 호출되면, reverse 메서드가 swap 메서드를 호출하는 구조이다.
reverse 메서드에서는 예외처리를 하고 있으나, swap 메서드에서는 예외처리를 하고 있지 않다. 따라서 예외가 발생할 경우 swap 메서드에서는 예외를 reverse 메서드로 전달한다. 예외에 대한 대처를 하지 않고, 그냥 던지는 것이다.
System.exit : 메서드 호출에 의한 프로그램의 강제 종료
예외를 다시 던지기
import java.util.Scanner;
public class ReverseArray2 {
// -- 배열의 요소 a[idx1]와 a[idx2]를 교환 -- //
static void swap(int[] a, int idx1, int idx2) {
int t = a[idx1];
a[idx1] = a[idx2];
a[idx2] = t;
}
// -- 배열 a의 요소를 반대로 나열(오류) -- //
static void reverse (int[] a) {
try {
for(int i=0; i<a.length/2; i++)
swap(a, i, a.length - i);
}catch (NullPointerException e) {
e.printStackTrace();
System.exit(1);
}catch (ArrayIndexOutOfBoundsException e) {
throw new RuntimeException("reverse의 버그? ", e); // 수정된 코드 부분 1
}
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("요소 수: ");
int num = stdIn.nextInt();
int[] x = new int[num];
for(int i=0; i<num; i++) {
System.out.print("x["+i+"]:");
x[i] = stdIn.nextInt();
}
try {
reverse(x); // 배열x의 요소를 반대 순서로 나열
System.out.println("반대로 나열했습니다.");
for(int i=0; i<num; i++)
System.out.println("x["+i+"]: "+ x[i]);
} catch (RuntimeException e) { // 수정된 코드 부분 2
System.out.println("예외 : "+ e);
System.out.println("예외의 원인 : "+ e.getCause());
}
}
}
결과
요소 수: 2
x[0]:3
x[1]:2
예외 : java.lang.RuntimeException: reverse의 버그?
예외의 원인 : java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
- 수정된 코드부분 1에서는 에러가 발생했을 때, 또 다른 RuntimeError를 발생시킨다.
- main 함수에서 RuntimeError를 catch하여 해당 에러에 대처하게 된다.
'Java > Java 기초' 카테고리의 다른 글
Java32 Exception 클래스와 RuntimeException 클래스 (0) | 2020.06.15 |
---|---|
Java31 예외 클래스- Throwable 클래스 (0) | 2020.06.12 |
Java30 오류 처리와 try-catch-finally 구문 (0) | 2020.06.10 |
Java29 String.equals, compareTo, String.format메서드 (0) | 2020.06.09 |
Java28 String. intern, length, charAt, indexOf (0) | 2020.06.08 |