2016-04-30 39 views
5

Sto riscontrando qualche problema nel tentativo di leggere una stringa e un doppio da un file txt. Ecco il mio file txt:È necessario leggere String e Double dal file

Mike 300.50 
John 260 
Lisa 425.33 

E qui è il codice che sto usando per leggerli:

reader = new Scanner(); 
while(reader.hasNext()){ 
    name= reader.next(); 
    salary = reader.nextDouble(); 
    System.out.println(name + " " + salary + "\r\n"); 
} 

Ogni volta che ho eseguito questo codice, Exception in thread "main" java.util.InputMismatchException mi appare dicendo che il problema è in nextDouble().

Qualcuno sa come risolvere questo?

+0

Il 'nextDouble()' lascia la nuova riga così la seconda chiamata a 'next()' consuma la nuova riga e quindi si prova e si analizza il nome successivo come una doppia. Ti suggerisco di leggere un'intera riga alla volta. –

+0

Così facendo non potrò salvare entrambe le cose con attributi diversi. O posso? – Tom

risposta

0

Si potrebbe provare in questo modo:

while(reader.hasNextLine()){ 
    String[] values = reader.nextLine().split("\\s+"); 
    name= values[0]; 
    salary = Double.valueOf(values[1]); 
    System.out.println(name + " " + salary + "\r\n"); 
} 
+0

Mi dispiace disturbare, ma cosa fanno quelle linee? Grazie. – Tom

+0

Volevo sapere queste righe: nome = valori [0]; stipendio = Double.valueOf (valori [1]); – Tom

+0

'' reader.nextLine(). Split ("\\ s +"); '' divide una singola riga alla volta in base allo spazio e la memorizza in una matrice di stringhe. Quindi sto ricevendo il nome della stringa da '' values ​​[0] '' primo elemento della matrice e '' Double.valueOf (valori [1]) '' analizzando il secondo elemento per raddoppiare – mmuzahid

-1

è possibile utilizzare per leggere java.io.StreamTokenizer String e doppio. StreamTokenizer diviso il file in token con un tipo di dati appropriato. e utilizzando alcune costanti è possibile identificare il tipo di token. come TT_NUMBER, TT_WORD

File f=new File("path of file"); 
StreamTokenizer st=new StreamTokenizer(new FileInputStream(file)); 
while(st.nextToken()!=StreamTokenizer.TT_EOF) //getting contents of file{ 
    switch(st.ttype) 
    { 
     case StreamTokenizer.TT_EOF: break; 
     case StreamTokenizer.TT_NUMBER://it will read number always in double data type 
      no=st.nval; 
     break; 
     case StreamTokenizer.TT_WORD: 
      name=st.nval; 
     break; 
    }} 
+0

Perché è stato downvoted? – Basilevs

3
reader = new Scanner(); 
while(reader.hasNext()){ 
    name= reader.next();  
    salary = reader.nextDouble(); 
    System.out.println(name + " " + salary + "\r\n"); 
    reader.nextLine(); 
} 

Prova questa. Quello che sta succedendo è che lo scanner sta leggendo la riga vuota dopo ogni doppio, quindi il nome sarà la linea vuota e leggerà (ad esempio) John come lo stipendio, e ti darà quell'eccezione. Quindi quello che ho fatto è stato aggiungere quella piccola riga di codice: reader.nextLine(); in modo che potesse saltare quella linea vuota. Spero che questo ti aiuti.