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