Fehlermeldung beim Versuch, einen String einzulesen

Bitte aktiviere JavaScript!
Hallo,

ich habe mich hier aufgrund folgenden Problems angemeldet. Ich habe eine Programm erstellt, welches dem Nutzer die Möglichkeit gibt, über den Aufruf einer Methode ein Array zu erstellen. Anschließend soll der Nutzer die Wahl haben, ob durch den Aufruf einer weiteren Methode entweder untersucht wird, ob das eingegebene Array sortiert ist, oder der Index des Maximums ausgegeben wird. Hierfür soll mit einer if-Abfrage überprüft werden, ob das eingegebene Wort mit dem entsprechenden String übereinstimmt. Hierbei kommt es jedoch zu einer Fehlermeldung.

Java:
import java.util.Scanner;

public class Array {

    public static void main(String[] args) {
       
        int[] ar = arrayEinlesen();
        Scanner scan = new Scanner(System.in);
        System.out.println("Um zu überprüfen, ob das Array sortiert ist, geben Sie \"sortiert\" ein");
        System.out.println("Um das Maximum zu bestimmen, geben Sie \"Maximum\" ein");
       
        String auswahl = scan.nextLine();
        if(auswahl.equals("sortiert"))
            istsortiert(ar);
        if(auswahl.equals("Maximum"))
            maximum(ar);
        scan.close();
       
    }

    public static boolean istsortiert(int[] array) {
        boolean sortiert = true;
        for (int i = 0; i < array.length - 1 && sortiert == true; i++) {
            if (array[i] > array[i + 1])
                sortiert = false;
        }
        if (sortiert == false) {
            sortiert = true;
            for (int i = 0; i < array.length - 1 && sortiert == true; i++) {
                if (array[i] < array[i + 1])
                    sortiert = false;
            }

        }
        return sortiert;
    }

    public static int maximum(int[] array) {
        int max = array[0];
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            if (max < array[i])
                max = array[i];

        }
        for (int i = 0; i < array.length; i++) {
            if (max == array[i])
                index = i;
        }
        return index;
    }

    public static int[] arrayEinlesen() {
        System.out.println("Geben Sie die Arraylänge ein:");
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] array = new int[n];
        System.out.println("Geben Sie die Zahlen des Arrays ein");
        for (int i = 0; i < array.length; i++) {
            array[i]=scan.nextInt();
        }
        scan.close();
        return array;
       
    }
}
Folgende Fehlermeldung wird angezeigt.
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
at Array.main(Array.java:12)
Danke im Voraus für Eure Hilfe!
 
Das Problem ist, dass Scanner.close() auch den darunterliegenden Eingabestrom (System.in) schließt. Du erzeugst insgesamt zwei Scanner. Einen in der main() Methode und einen in arrayEinlesen(). Beide Scanner bekommen eine Referenz auf denselben Eingabestrom System.in und das Schließen des Scanners innerhalb von arrayEinlesen() führt dazu, dass der Scanner in main() nichts mehr lesen kann. Am besten solltest du nur einen einzigen Scanner erzeugen und diesen z.B. als Parameter an die Methode arrayEinlesen() weitergeben. Und dann in arrayEinlesen() kein scan.close() mehr aufrufen, sondern nur in main().
 
Ich habe das anfangs so umgesetzt, wie Du mir empfohlen hast. Die Fehlermeldung verschwand hieraufhin auch, allerdings war es mir danach nicht mehr möglich, einen String einzugeben. Ich habe das Problem anschließend gelöst, nachdem ich eines neues Scanner-Objekt mit einem anderen Namen erstellt habe.
Code:
public static void main(String[] args) {
        
        
        Scanner scan = new Scanner(System.in);
        Scanner scan2 = new Scanner(System.in);
        int[] ar = arrayEinlesen(scan);
        System.out.println("Um zu überprüfen, ob das Array sortiert ist, geben Sie \"sortiert\" ein");
        System.out.println("Um das Maximum zu bestimmen, geben Sie \"Maximum\" ein");
        
        String auswahl = scan2.nextLine();
        if(auswahl.equals("sortiert"))
            System.out.println(istsortiert(ar));
        if(auswahl.equals("Maximum"))
            System.out.println(maximum(ar));
        scan.close();
        scan2.close();
        
    }
Das hat jetzt zwar funktioniert, allerdings verstehe ich nicht, warum ich es nicht bei einem Scanner-Objekt hätte belassen können, scan.close() erfolgt ja erst am Ende der main-Funktion.
 
Hier ist jetzt das Problem, dass der letzte Aufruf von Scanner.nextInt() innerhalb von arrayEinlesen() nicht mehr den Zeilenumbruch mit einliest, den du generierst, wenn du die letzte Zahl in die Konsole schreibst und ENTER drückst. Das heißt, der nächste Aufruf von Scanner.nextLine() liefert eine Leerzeile und dein Programm wird beendet.
Abhilfe kannst du dir dadurch schaffen, dass du ein separates scan.nextLine() am Ende der arrayEinlesen() Methode einbaust:
Java:
public static int[] arrayEinlesen(Scanner scan) {
  System.out.println("Geben Sie die Arraylänge ein:");
  int n = scan.nextInt();
  int[] array = new int[n];
  System.out.println("Geben Sie die Zahlen des Arrays ein");
  for (int i = 0; i < array.length; i++) {
    array[i] = scan.nextInt();
  }
  scan.nextLine(); // <- Leerzeile lesen
  return array;
}
Dann kannst du auch wieder nur einen einzigen Scanner nutzen.

Übrigens: Das nächste Problem wird dann sein, dass du dich wunderst, warum nichts ausgegeben wird, wenn du "sortiert" oder "Maximum" als letzte Eingabe bestätigst. Das liegt daran, dass du das Ergebnis der Aufrufe istsortiert() bzw. maximum() nirgends ausgibst.
 
Passende Stellenanzeigen aus deiner Region:

Oben