Risolto AIUTO!!! gli Scanner mi stanno facendo impazzire!

BluePanda

Utente Iron
16 Giugno 2022
2
1
0
4
Sto cercando di creare un programma in java, ma nel gestire gli Scanner per l'input continuo ad avere problemi, per favore aiutoooooo!!!

questo è il codice completo, non riesco a trovare il problema.

import java.util.Scanner;

class Scratch {
public static void main(String[] args) {

System.out.println("Hi");
System.out.println("Just press 0 and ENTER");
Scanner choice = new Scanner(System.in);
int chosen = choice.nextInt();
choice.close();

if (chosen == 0) {
System.out.println("Ok");
Scanner scanner = new Scanner(System.in);
System.out.println("Enter something");
String a = scanner.nextLine();
System.out.println(a);
}
}
}

grazie! ♥
 
Ultima modifica:
Quando chiudi lo scanner vai anche a chiudere lo stream al suo interno. Gli standard input streams (System.in e System.out) vengono aperti automaticamente dal sistema operativo e non li puoi aprire a mano, quindi se chiudi uno scanner costruito con new Scanner(System.in) vai a chiudere anche System.in e non puoi più riaprirlo. Se uno scanner deve rimanere sempre aperto, allora tanto vale metterlo statico
Java:
import java.util.Scanner;

class Scratch {
    private static Scanner stdin = new Scanner(System.in);

    public static void main(String[] args) throws Exception {
        System.out.println("Hi");
        System.out.println("Just press 0 and ENTER");
        int chosen = stdin.nextInt();

        if (chosen == 0) {
            System.out.println("Ok");
            System.out.println("Enter something");
            String a = stdin.nextLine();
            System.out.println(a);
        }
    }
}
A questo punto non hai più errori, però il tuo programma non fa ciò che ti aspetti. Ti ritrovi in nel problema che ho discusso in: L'input non funziona correttamente, l'utente non ha la possibilità di inserirlo. C'è della sporcizia nel buffer stdin. Lo scanner estrapola l'intero da System.in, ma non rimuove la newline che è presente perché hai premuto invio. Per risolvere devi aggiungere stdin.nextLine(); (i.e., finisci di leggere la linea e butta via tutto quello che trovi) subito dopo aver letto l'intero.

Se vuoi la mia opinione, non usare Scanner per leggere da System.in. Considera la lettura dell'input e il suo parsing come due problemi separati: per leggere l'input usa sempre System.console().readLine();, che non crea problemi perché agisce come scanner.nextLine() ma senza creare uno scanner, poi se vuoi un intero (o un float o altro) preoccupati di convertire una stringa ad intero. Nel tuo caso
Java:
class Scratch {
    public static void main(String[] args) {
        System.out.println("Hi");
        System.out.println("Just press 0 and ENTER");

        String input = System.console().readLine();
        int chosen = Integer.valueOf(input);

        if (chosen == 0) {
            System.out.println("Ok");
            System.out.println("Enter something");
            String a = System.console().readLine();
            System.out.println(a);
        }
    }
}

PS. Vedo che sei nuovo, quando posti codice ricordati di usare il tag code (lo attivi clickando il tasto </> nell'editor dei messaggi).
 
  • Mi piace
Reazioni: BluePanda