2013-09-27 11 views
6

Ho una stringa da cui vorrei analizzare un numero intero e non riesco a trovare un modo per superare questa eccezione di runtime. Comprendo che è destinato a essere visualizzato in momenti in cui una funzione parseNUMBERTYPE viene applicata a una stringa definita in modo inappropriato e che gli spazi vuoti o le lettere in cui il codice si aspetta che i numeri siano in grado di attivarlo. Tuttavia, la stringa che sto usando come manichino di prova è per quanto posso dire semplicemente sul numero 5. Ho visto diversi suggerimenti in risposta ai problemi di NumberFormatException di altri utenti che sostengono l'applicazione di una funzione trim() prima dell'analisi, e io ho provato questo senza successo.NumberFormatException dato un input String in possesso di un numero intero piccolo

Ho anche provato a sostituire la stringa che desidero analizzare con il semplice valore non memorizzato "5". Questo è lo stesso di quello che il programma sembra riportare come valore String memorizzato della variabile pertinente, ma mentre l'analisi di quella variabile fallisce con l'eccezione omonimo di questo post, il valore non memorizzato sembra funzionare perfettamente al suo posto.

Si noti che la variabile String viene letta da uno Scanner file. Devo supporre che il mio problema abbia qualcosa a che fare con caratteri sconosciuti, indesiderati, 'invisibili' che vengono letti oltre al numero cinque, ma non riesco a determinare perché questo sta accadendo o come fermarlo. Il file viene formattato come .txt

Ecco il mio codice:

Scanner scan = new Scanner(System.in); 
    System.out.println("Please enter the file name:"); 
    String filename = scan.nextLine();  
    File tempfile = new File(filename); 
    Scanner filereader = new Scanner(tempfile); 

    //this is meant to assign to the String line1 the numerical value (5) 
    //of the file's first line 
    String line1 = filereader.nextLine(); 

    //this was added later to determine if line1 held the value I expect 
    //it outputs the single digit 5, as expected and appropriate 
    System.out.println(line1); 

    //this was added to test how flawed my system was 
    //it runs fine, indicating to me that the problem may in my reader 
    int num2 = Integer.parseInt("5"); 

    //this is where the exception is cast 
    int num1 = Integer.parseInt(line1); 

mi sono presentato con questi errori:

Exception in thread "main" java.lang.NumberFormatException: For input string: "5" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:492) 
at java.lang.Integer.parseInt(Integer.java:527) 
at Driver.main(Driver.java:26) 

Il vostro aiuto è apprezzato.

In risposta ai suggerimenti dati fino ad ora, il codice è stato modificato per apparire come segue:

Scanner scan = new Scanner(System.in); 
    System.out.println("Please enter the file name:"); 
    String filename=scan.nextLine();   
    File tempfile = new File(filename); 
    Scanner filereader = new Scanner(tempfile); 

    //this is meant to assign the String line1 the numerical value (5) 
    //of the file's first line 
    String line1 = filereader.nextLine(); 

    //this was added after to determine if line1 held the value I expect 
    //it outputs the single digit 5, as expected and appropriate 
    System.out.println("["+line1+"]"); 

    //this was added to test how flawed my system was 
    //it runs fine, indicating to me that the problem is in my reader 
    int num2 = Integer.parseInt("5"); 

    //this is where the exception is cast 
    int num1 = Integer.parseInt(line1.trim()); 

Si prega di correggermi se ho male interpretato la vostra guida in qualche modo. Così com'è, il problema persiste, con un errore identico.

+4

Provare a usare 'Intero.parseInt (line1.trim()); ' –

+2

Rohit ha ragione: il carattere di avanzamento riga deve essere il colpevole ... nextLine() legge anche questo. E lo lascia nella stringa ... Comunque: la tua domanda è molto carina, ** formattata correttamente **, e generalmente un piacere da guardare. Ed è il tuo _primo! Continuate così! Ci sono un bel po 'di persone qui, che non possono postare domande così belle anche dopo molto tempo qui ... – ppeterka

+5

A proposito, sulla tua dichiarazione di debug 'System.out.println (line1);' raccomando caldamente qualcosa più come 'System.out.println (" ["+ line1 +"] ");' in futuro. Parentesi quadre, parentesi, citazioni, qualunque cosa. Trovo personalmente utile avvolgere stringhe in una sorta di carattere che mi aiuterà a identificare se c'è uno spazio bianco su entrambe le estremità della stringa. – nhgrif

risposta

1

Guardando il messaggio nell'eccezione, mostra che non ci sono caratteri o spazi bianchi aggiuntivi nella stringa poiché il 5 è circondato da virgolette (e una rapida verifica del codice sorgente Java mostra che il messaggio qui stampato non non sembra essere modificato per rimuovere gli spazi bianchi prima di circondare la stringa con le virgolette).

Ciò significa che o si nascondono i caratteri non stampabili nella stringa, o il 5 per sé non è in realtà un 5 a tutti, ed è invece un po 'di caratteri Unicode da un'altra lingua che assomiglia a un 5.

Semplice il debug per risolvere questo problema sarebbe quello di stampare la lunghezza della stringa, in quanto ciò risolve rapidamente se ci sono altri caratteri nascosti in essa.

System.out.println("String: [" + line1 + "] size: " + line1.size()); 

Dopo di che, una regex può essere utilizzato per ottenere la prima serie consecutiva di cifre, se questo è il comportamento desiderato:

Pattern pattern = Pattern.compile("(\\d+)"); 
    Matcher matcher = pattern.matcher(line1); 
    if (matcher.find()) 
    { 
     String digits = matcher.group(); 
     int num = Integer.parseInt(digits); 
    } 

In alternativa, se è possibile o desidera rimuovere caratteri tra le cifre poi un replaceAll possono essere utilizzati:

String digits = line1.replaceAll("[^0-9]",""); 

Per la stringa "5 6", il primo metodo vi darà 5, e la seconda vi darà 56.