Scanner wartet nicht auf Benutzereingabe

        boolean correct = false;
        while (!correct) {
            try (Scanner in = new Scanner(System.in)) {
                System.out.print("Bitte geben Sie die Höhe der Baumkrone an: ");
                String eingabeString = in.nextLine();
                int eingabe = Integer.parseInt(eingabeString);
                correct = true;
            } catch (NumberFormatException | NoSuchElementException ex) {
                System.err.println("Bitte geben Sie eine Zahl ein!");
                correct = false;
            }
        }
    }```

Hab mal meinen eigenen Programmcode etwas verkürzt. Wenn der Benutzer keine Zahl eingibt, gibt er mir 1000x den Catch-Bereich aus. Wieso wartet er dann nimmer auf die Benutzereingabe?

Wie verhält sich das ganze, wenn du den Scanner vor! der Schleife deklarierst?

Scanner hat auch die Methode nextInt, die auch nicht schlecht sein soll.

try-Ressource schließt System.in, danach keine Eingabe mehr möglich,
nur noch NoSuchElementException,

wenn nicht wäre es allein auch schon Verschwendung, ständig neue Scanner anzulegen,
idealerweise nur einmal global,
statische Variable vergleichbar mit System.in durchaus vertretbar im einfachen Falle,
Ressourcen-Frage darf hier mal ausgeklammert werden

Das Try vor die Schleife hatte ich auch schon im Sinn, nur dann hätte ich 2 Try gebraucht, einmal das try with resources und das try mit catch. Dachte es würde gehen, beides zu kombinieren. Aber mit dem Vor die Schleife und dann 2 Try hat es schon geklappt, schaut nur finde ich etwas bescheiden aus. Und ich sagte ja, das Programm oben ist stark gekürzt, ich brauche den String noch.

Tja, try-with-resources und AutoClosable - dass in einem loop zu verbauen ist halt keine gute Idee - wie man hier schön am Beispiel von System.in sieht.
[ot]Sollte man die System-Streams nicht lieber so sub-classen dass bei close() eine Exception fliegt und dann halt die Setter rausnehmen mit denen man umleiten kann? Wieder so eine Alt-Last an die beim ersten compile-Versuch wieder keiner gedacht hat.
redesign plox[/ot]

[ot]aber ein Problem der annehmbareren Sorte,
sorgt dauerhaft für Threads wie diese hier und gutes Lernen :wink:
[/ot]

Das sieht nur bescheiden aus, solange das alles in einer Methode stattfindet.

Wenn du das aufteilst nach dem Motto

        try {
            tryToDoSomething(...);
        }
        catch (XyzException exception) {
            handleError(exception);
        }
    }```

```    private void doSomething(...) throws XyzException {
        // ...
    }```

```    private void handleError(XyzException exception) {
        // ...
    }```

stellt sich das Ganze imho wesentlich übersichtlicher und schöner dar. In deinem Fall dann halt zweimal verschachtelt.