Funzionamento di hasNextLine() per leggere un file

di il
4 risposte

Funzionamento di hasNextLine() per leggere un file

Salve a tutti. Non riesco a capire il funzionamento del metodo hasNextLine(), mi spiego meglio: ho capito che il metodo in questione controlla se sullo standard input e' presente un'ulteriore riga, e dunque se il controllo ha esito positivo restituisce il valore true, altrimenti restituisce false.
Ora viene il mio problema: quando eseguo questa classe, l'interprete lancia in esecuzione NoSuchElementException. Ho osservato infatti che anche se nel documento che passo come argomento dalla riga di comando ho finito le righe la condizione nel while non diventa false. Qualcuno saprebbe spiegarmi il motivo e saprebbe indicarmi una soluzione per evitare il lancio dell'eccezione?
 

import java.util.Scanner;
import java.io.*;

public class Prova
{
	public static void main(String[] args) throws IOException
	{
		if(args.length != 1)
			throw new IllegalArgumentException();
		Scanner console = new Scanner(new File(args[0]));
		while(console.hasNextLine()) { 
			String chiave = console.next();
			String valore = console.next();
			System.out.println(valore + chiave);
		}		
	}

}
Questo e' il file che voglio leggere:
pane bread
amore love
fantasia fancy
libro book
mio mine
casa house
strada street
e and
il the
fondo end

4 Risposte

  • Re: Funzionamento di hasNextLine() per leggere un file

    Non usare hasNextLine() e next() perché potrebbero esserci problemi perché uno controlla le linee l'altro le parole. Usa hasNext() tanto non cambierà nulla.... Prova se funziona così.

    Per maggiori informazioni vedi qui:
    https://www.iprogrammatori.it/forum-programmazione/java/problema-lettura-documento-txt-t30200.html
  • Re: Funzionamento di hasNextLine() per leggere un file

    Grazie mille del consiglio , ho provato ed ho visto che potrebbe essere una soluzione, pero' in realta' mi servirebbe usare il controllo sulla riga, perche' vorrei mettere, per ogni riga, la prima parola come chiave in un dizionario e la seconda come valore (per creare una sorta di traduttore). Inoltre mi piacerebbe anche capire perche' il controllo di hasNextLine() non funziona come io mi aspetto.
  • Re: Funzionamento di hasNextLine() per leggere un file

    Spero di non sparare una grande ma credo che il motivo sia questo

    hasNextLine() verifica che ci sia una riga
    la riga esiste
    vegono scansionate due parole

    viene rieseguita la hasNextLine().... Lo scanner precedentemente menzionato non ha preso il carattere EOL e quindi la hasNextLine va a verificare se esiste una riga tra l'ultima parola scansionata e il carattere EOL... La riga esiste ergo quando vai ad effettuare la scansione va tutto in errore perché in realtà la riga (come la intendi tu, non come la intende il pc) non esiste.

    Esempio:
    CIAO BELLO\EOL
    hanNextLine() -> true
    scan CIAO
    scan BELLO
    hasNextLine() -> true perché tra BELLO e \EOL comunque non c'è un carattere EOL
    next() ------> ma in realtà quella di "CIAO BELLO" era l'ultima riga e quindi va tutto in errore....

    La mia spiegazione è questa... Sicuro qualcuno più esperto di me saprà darti qualche risposta più esaustiva.
  • Re: Funzionamento di hasNextLine() per leggere un file

    Grazie! gentilissimo, ora ho capito un po' di più!
Devi accedere o registrarti per scrivere nel forum
4 risposte