JAVA/JAVA 정리

[JAVA] 예외처리방법 예제 (try catch)

웹코린이 2023. 5. 31. 08:52
728x90
// [ 연습문제 ]
// 정수를 10개가 될때까지 입력
// 입력한 정수들을 모두 출력 
// [ 1, 3, -1, 10, 0, ... ]
// 이중에서 0이하인 정수들을 모두 제거
// [ 1, 3, 10, 0, ...]
// 이중에서 가장 큰 정수가 저장된 인덱스 넘버 출력 
// 현재는 2번 인덱스
// 가장 큰 정수를 제외하고 남은 정수들의 합과 평균 출력
//       4        2.0

처음 짠 코드

public class ExceptionTask {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayList<Integer> data = new ArrayList<Integer>();
		int cnt = 0;
		int num = 0;
		int sum = 0;
		int max = Collections.max(data);
		while(cnt < 10) {
			
			try {
				System.out.print("정수를 입력해주세요. ");
				num = sc.nextInt();
				System.out.println("입력한 정수: " + num);
			} catch (InputMismatchException e) {
				sc.nextLine();
				System.out.println("정수만 입력이 가능합니다..");
			}
			
			sum += num;
			data.add(num);
			cnt++;
		}
		
		int i = 0;
		while(i < data.size()) {
			if(data.get(i) <= 0) {
				System.out.println("0이하의 수 : " + data.get(i));
				data.remove(i);
			}
			i++;
		}
		
		int maxIndex = data.indexOf(max);
		System.out.println("가장 큰 수의 인덱스 : " + maxIndex);
		sum -= max;
		data.remove(max);
		
		double avg = (double)sum / data.size();
		
		System.out.println("가장 큰 수를 제외하고 총합 : " + sum + ", 평균 : " + avg);
		
		
	}
}

에서 예외가 발생하였다.

Exception in thread "main" java.util.NoSuchElementException // max의 정보를 찾을 수 없음.
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:970)
	at java.base/java.util.Collections.max(Collections.java:674)
	at class02.ExceptionTask.main(ExceptionTask.java:31)

그래서 생각을 해보니 ArrayList의 정보를 입력 받지도 않고 max를 찾으려고 하니 예외가 났다는 것을 알게 되었다.

따라서 maxIndex를 구하는 코드 쪽으로 max 선언을 옮겨 줬다.

	int max = Collections.max(data);
	int maxIndex = data.indexOf(max);
	System.out.println("가장 큰 수의 인덱스 : " + maxIndex);
	sum -= max;
	data.remove(max);
		
	double avg = (double)sum / data.size();
	
	System.out.println("가장 큰 수를 제외하고 총합 : " + sum + ", 평균 : " + avg);

옮기고 나니 정수가 입력 받아지는 것을 확인할 수 있었다. 그런데 정수를 10개를 입력을 받고 나니 이런 예외가 발생하였다.

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 10 out of bounds for length 10
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
	at java.base/java.util.Objects.checkIndex(Objects.java:359)
	at java.base/java.util.ArrayList.remove(ArrayList.java:504)
	at class02.ExceptionTask.main(ExceptionTask.java:58)

예외 내용은 data.remove(max)에서 remove의 인자값이 index인데 (입력한 값 중 max = 10) 10번방이 없는데 어떻게 지우냐는 내용이었다. 따라서 코드를 이런식으로 수정할 수 있었다.

int max = Collections.max(data);
int maxIndex = data.indexOf(max);
System.out.println("가장 큰 수의 인덱스 : " + maxIndex);
sum -= max;
data.remove(maxIndex); 
		
double avg = (double)sum / data.size();
		
System.out.println("가장 큰 수를 제외하고 총합 : " + sum + ", 평균 : " + avg);

max에서 maxIndex로 변경할 수 있었다. 그런데 또 총합과 평균을 구하는 부분에서 예외가 발견되었다.

정수를 입력해주세요. -1
입력한 정수: -1
정수를 입력해주세요. -2
입력한 정수: -2
정수를 입력해주세요. -3
입력한 정수: -3
0이하의 수 : -1
0이하의 수 : -3
가장 큰 수의 인덱스 : 0
가장 큰 수를 제외하고 총합 : -4, 평균 : -Infinity

총합계를 맨 밑에서 연산하는 식으로 바꿨다.

double avg = 0;
for (int value : data) {
	if (data.get(value) > 0) {
		sum += value;
		sum -= max;
	}
}

이렇게 코드를 바꿈에 따라 배열리스트에 저장된 음수와 최대값을 제외한 합계와 평균을 구할 수 있었다.

정수를 입력해주세요. -1
입력한 정수: -1
정수를 입력해주세요. -2
입력한 정수: -2
정수를 입력해주세요. -3
입력한 정수: -3
가장 큰 수의 인덱스 : 0 
가장 큰 수를 제외하고 총합 : 0, 평균 : NaN

최종 코드

import java.util.ArrayList;
import java.util.Collections;
import java.util.InputMismatchException;
import java.util.Scanner;

public class ddddd {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayList<Integer> data = new ArrayList<Integer>();
		int cnt = 0;
		int num = 0;
		int sum = 0;
		while(cnt < 3) {
			
			try {
				System.out.print("정수를 입력해주세요. ");
				num = sc.nextInt();
				System.out.println("입력한 정수: " + num);
			} catch (InputMismatchException e) {
				sc.nextLine();
				System.out.println("정수만 입력이 가능합니다..");
			}
			
			data.add(num);
			cnt++;
		}
		
		int i = 0;
		while(i < data.size()) {
			if(data.get(i) <= 0) {
				data.remove(i);
			}
			i++;
		}
		
		int max = Collections.max(data);
		int maxIndex = data.indexOf(max);
		System.out.println("가장 큰 수의 인덱스 : " + maxIndex);
		data.remove(maxIndex);
		
		for(int value : data) {
			if(data.get(value) > 0) {
				sum += value;
				sum -= max;
			}
		}
		double avg = (double)sum / data.size();
		System.out.println("가장 큰 수를 제외하고 총합 : " + sum + ", 평균 : " + avg);
	}
}
728x90