Closed federico-camerota closed 4 years ago
Dalla documentazione 1.Java Scanner hasNext () Method:
It is a Scanner class method which returns true if this scanner has another token in its input. This method may block while waiting for input to scan.
Ora vedo se trovo soluzioni migliori, anche se non capisco da come e' scritto se questo behaviour sia un bug o per qualche motivo voluto
Direi che è voluto. Il senso è quello di aspettare fino a che la sorgente ha nuovo input oppure viene segnalato che non c'è più input con un EOF o simili (Ctrl+d su terminale). Ovviamente la cosa dovrebbe valere solo per sorgenti tipo System.in in cui vi è la possibilità di nuovo input su richiesta. Nel caso di un file o di una stringa invece dovrebbe restiture false se l'input è terminato.
Soluzione proposta (non testata compilando, come idea):
Scanner s= new Scanner(System.in);
//s.tokens() returns Stream of Strings from input separated by default sep " " if(s.tokens().count()==1) return s.tokens().map(x->Integer.valueOf(x)).sum(); throw Error
Direi che può andare
Dimenticavo che sum giustamente si applica su un IntStream
all the same except
return s.tokens().mapToInt(x->Integer.valueOf(x)).sum();
visto che s.tokens() per qualche motivo consuma lo scanner originario, ho cambiato approccio:
prima costuisco la List
Visto che tokens consuma lo scanner suggerirei di arrivare alla lista usando Arrays.toList(s.nextLine().split()). Non è funzionale ma elimina il problema. Credo comunque lo scanner in questo caso continui a funzionare anche dopo aver chiamato tokens perchè legato a System.in
Inoltre quando si cattura l'eccezione input (la lista) dev'essere aggiornata nuovamente leggendo dalla sorgente di input.
dovrei aver risolto tutto. ho provato anche il behaviour delle eccezioni e gia' che c'ero ho fatto si che gli elementi vuoti in una lista non ci diano problemi(quindi un input=" 4" oppure "4 " vengano ragionevolmente considerati validi). Confermami che chiudo
L'idea andava bene, ho apportato un paio di semplici modifiche:
https://github.com/samadio/SDM_exam/blob/game_dev/src/main/java/dotsandboxes/DotsAndBoxesInput.java#L111
Questa linea fa si che il programma rimanga in attesa di nuovo input usando System.in. Commentata per far funzionare il programma e verificarne il funzionamento. Andrebbe rivista e migliorata.