java.util.scanner Fehler

m7934

Mitglied
Hallo,
könnt ihr mir helfen, denn hier kommt es beim zweiten Durchlauf der Schleife aus der main Methode einen Fehler mit dem scanner, der beim ersten Mal nicht auftritt.

Java:
import java.util.Scanner;

public class arraysort {

    public static void main(String[] args) {
      
        int a = 0;
      
        double[] arr = new double[10];
        do {
            double d;
            d = eingabe();
            arr[a] = d;
            int b = 0;
            do {
                System.out.println(arr[b]);
                b++;
            } while (b <= a);
            a++;
        } while (a < 10);
    }
  
    static double eingabe () {
        Scanner scanner0 = new Scanner(System.in);
        double a;
        System.out.print("Geben Sie jetzt bitte Ihre Zahl ein: ");
        a = scanner0.nextDouble();
        System.out.println();
      
        scanner0.close();
        return a;
    }
}

Folgenden Text gibt er beim zweiten Durchlauf der Schleife aus:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at arraysort.eingabe(arraysort.java:29)
at arraysort.main(arraysort.java:12)
 
Es gibt so eine Regel, die besagt, dass man einen Stream nur schließen sollte, wenn man ihn auch geöffnet hat.

Mit deinem Scanner.close() schließt du auch den Inputstream "System.in". Und einmal geschlossen, kannst du nicht mehr davon lesen.

Am besten arbeitest du mit einem Scanner, den du immer in die Methode gibst:
Java:
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int a = 0;

        double[] arr = new double[10];
        do {
            double d;
            d = eingabe(sc);
            arr[a] = d;
            int b = 0;
            do {
                System.out.println(arr[b]);
                b++;
            } while (b <= a);
            a++;
        } while (a < 10);
    }

    static double eingabe (Scanner sc) {
        double a;
        System.out.print("Geben Sie jetzt bitte Ihre Zahl ein: ");
        a = sc.nextDouble();
   
        System.out.println();

        return a;
    }
 
Hallo,
danke für deine schnelle Antwort. Ich dachte, dass man scanner immer schließen müsste, denn Eclipse gibt sonst den Fehler scanner is never closed, aus.
 
Das ist nur eine Warning 😉

Wenn du deinen Scanner schließen willst, dann machste dann am Ende deines Codes, also nachdem du alles eingelesen hast. Typischerweise über einen try-with-resource Block oder im finally-Block.

Dann sollte dir aber auch bewusst sein, dass du danach nichts mehr von System.in einlesen kannst.
Um das zu umgehen gibts dann sowas wie ClosedShieldInputStreams aber das ist für den Anfang dann auch etwas Overkill.
 

Neue Themen


Zurück
Oben