Uczę się obsługiwać wyjątek i w bloku try, jeśli otrzymam dane wejściowe w arr[i], chcę, aby blok catch ponownie poprosił o wprowadzenie tablicy. Ale kod wejściowy tablicy bloków catch generuje błąd.

package Day2;

import java.util.Scanner;

public class LargestinArray {
public static void main(String[] args) {
    System.out.println("enter 5 number");
    Scanner scanner=new Scanner(System.in);
    int arr[]=new int[5];


   try{
       for (int i=0;i<5;i++){
           arr[i]=scanner.nextInt();
       }
   }catch (Exception e){
       System.out.println("error");
       for (int i=0;i<5;i++){
           arr[i]=scanner.nextInt();
       }

   }

    findLarge(arr);


}

private static void findLarge(int[] arr) {
    int max=arr[0],min=arr[0];
    for (int i=0;i<arr.length;i++){
        if (arr[i]>max){
            max=arr[i];
        }
        if (arr[i]<min){
            min=arr[i];
        }
    }
    System.out.println("max is"+max+"min is"+min);
}
}

To jest błąd, który dostaję

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at Day2.LargestinArray.main(LargestinArray.java:19)
0
Pawan Acharya 16 grudzień 2019, 17:40
1
Próbujesz ponownie wykonać ten sam kod, który potencjalnie zgłasza błąd w bloku catch. Nie rób tego. EDYCJA: Oto dokumentacja tego błędu , także.
 – 
Mazzone
16 grudzień 2019, 17:43
Chcę, aby użytkownik ponownie wszedł w blok catch, jak mogę to osiągnąć?
 – 
Pawan Acharya
16 grudzień 2019, 18:08
Spróbuj umieścić blok try/catch w pętli while, która zakończy się po poprawnym wprowadzeniu.
 – 
NomadMaker
16 grudzień 2019, 18:21

2 odpowiedzi

Poniższy kod spróbuje odczytać dane wejściowe skanera i będzie próbował ponownie i ponownie, aż uda mu się odczytać 5 int z rzędu. Jeśli niekoniecznie chcesz, aby prawidłowe dane wejściowe następowały po sobie, napisz komentarz poniżej, a ja edytuję tę odpowiedź.

boolean isDone = false;
while (!isDone) {
    try {
        for (int i = 0; i < 5; i++){
            arr[i] = scanner.nextInt();
        }
        isDone = true;
    } catch (Exception e){
       System.out.println("error");           
    }
}
0
InsertKnowledge 16 grudzień 2019, 18:39
To nie działa, jeśli użytkownik wprowadzi dane wejściowe niecałkowite – scanner.nextInt() nie zużyje tych danych wejściowych, więc po pierwszym wystąpieniu czegoś takiego jak „a”, ten kod wyświetli „błąd” na zawsze bez patrzenia na inne Wejście.
 – 
kaan
16 grudzień 2019, 20:40

Oto sposób odczytywania danych wejściowych, zapętlony w nieskończoność, aż zostanie znalezionych pięć kolejnych liczb całkowitych.

Zauważ, że zamiast używać scanner.nextInt(), używam scanner.next(). Powodem jest to, że nextInt() pozostawi nieużywane dane wejściowe niebędące liczbami całkowitymi nadal znajdują się na skanerze - to znaczy, jeśli czeka coś niecałkowitego, takiego jak ciąg, ten ciąg nadal będzie tam, gdy wywołasz nextInt() jeszcze raz. Możesz sprawić, by scanner.nextInt() zadziałało, wywołując scanner.next() wewnątrz bloku catch, ale może być więcej do rozważenia, czy powoduje to jakiekolwiek inne problemy.

private static int[] getNumbers() {
    Scanner scanner = new Scanner(System.in);
    while (true) {
        try {
            int[] numbers = new int[5];
            for (int i = 0; i < 5; i++) {
                String next = scanner.next();
                numbers[i] = Integer.parseInt(next);
            }
            return numbers;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Możesz zadzwonić do tej funkcji:

int[] numbers = getNumbers();
System.out.println("numbers: " + Arrays.toString(numbers));
0
kaan 16 grudzień 2019, 20:36