View Full Version : [JAVA] Errore incomprensibile
@mattste
26-11-2011, 20:08
Ciao a tutti , sono ancora alle prime armi con java e sto riscontrando uno strano problema che da oltre 1 ora nn riesco a risolvere per un programma molto corto è facile .
Devo calcolare la media in modo ricorsivo da un file contenente un intero per riga . Questo è il codice del metodo statico :
public static int mediaDaFile(BufferedReader r) throws IOException{
String linea=r.readLine();
if (linea==null)
return (Integer.parseInt(linea));
else
return ((Integer.parseInt(linea)+mediaDaFile(r))/2);
}
Questo è il main :
FileReader f = new FileReader("prova.txt");
BufferedReader br = new BufferedReader(f);
System.out.println(Numeri.mediaDaFile(br));
Nel file ho messo solo 4 interi per prova in un file nella stessa cartella prova.txt .
La compilazione và a buon fine ma in esecuzione mi dà sempre questo errore :
Exception in thread "main" java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Numeri.mediaDaFile(Numeri.java:113)
at Numeri.mediaDaFile(Numeri.java:115)
at Numeri.mediaDaFile(Numeri.java:115)
at Numeri.main(Numeri.java:146)
Grazie e scusate per la domanda stupida ma non riesco a trovare l'errore e sto veramente impazzendo :D
ciao,
ti consiglio di scrivere:
if (linea == "")
inoltre prova con questo
String linea = r.readline().trim()
forse il tuo file non contiene solo numeri ma anche degli spazi che impediscono a java di convertire la string in integer.
@mattste
26-11-2011, 21:04
continua a non andare :(
__ZERO_UNO__
26-11-2011, 23:28
Se linea == null tenti di convertirla in intero? E quale numero intero sarebbe null?
Non usare BufferReader, è obsoleto. Meglio la classe Scanner.
@mattste
27-11-2011, 00:24
si effettivamente nn ha proprio senso vedendolo a distanza di tempo quell'
if (linea==null) . Resta il fatto che ora ho realizzato che cosi non funziona a me serve l'ultimo valore in modo tale che la divisione/2 mi dia il valore uguale all'ultimo intero ma attualmente nn saprei fare con un metodo ricorsivo :(. Ho provato con mark e reset ma ho realizzato che cmq nn risolverei il problema :( . qualcuno ha qualche idea su come farlo in modo ricorsivo!?(ovviamente immagino non valga leggere l'ultimo valore da un altro metodo e passarlo come parametro seppur funzionale ).
Non uso lo scanner poiche per ora i professori ci consigliano di utilizzare determinate classi, anche piu rognose ,ma che possono aiutare a capire essendo ancora alle prime armi (diciamo che di fatto ci vincolano ad utilizzarle)
EDIT :è sbagliato in ogni caso provo a trovare un altro modo per risolvere il problema . grazie cmq :D
Ciao a tutti , sono ancora alle prime armi con java e sto riscontrando uno strano problema che da oltre 1 ora nn riesco a risolvere per un programma molto corto è facile .
Devo calcolare la media in modo ricorsivo da un file contenente un intero per riga . Questo è il codice del metodo statico :
public static int mediaDaFile(BufferedReader r) throws IOException{
String linea=r.readLine();
if (linea==null)
return (Integer.parseInt(linea));
else
return ((Integer.parseInt(linea)+mediaDaFile(r))/2);
}
Questo è il main :
FileReader f = new FileReader("prova.txt");
BufferedReader br = new BufferedReader(f);
System.out.println(Numeri.mediaDaFile(br));
Nel file ho messo solo 4 interi per prova in un file nella stessa cartella prova.txt .
La compilazione và a buon fine ma in esecuzione mi dà sempre questo errore :
Exception in thread "main" java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Numeri.mediaDaFile(Numeri.java:113)
at Numeri.mediaDaFile(Numeri.java:115)
at Numeri.mediaDaFile(Numeri.java:115)
at Numeri.main(Numeri.java:146)
Grazie e scusate per la domanda stupida ma non riesco a trovare l'errore e sto veramente impazzendo :D
Il problema è semplice, ottieni un NULL pointe exception a causa dell'IF. Un BufferedReader torna NULL solo in caso di arrivo di EOF, cioè quando lo stream di lettura viene chiuso. Quello che tu fai è
"assegno a line il valore di ritorno di readLine"
"se il valore è null, ritorno la rappresentazione in Intero di NULL":muro: :muro:
E qui che non ci siamo: se linea è NULL, è finito lo stream di lettura e non puoi convertire NULL in un intero!
Se linea == NULL, allora hai raggiunto EOF, fai tornare 0!
public static int mediaDaFile(BufferedReader r) throws IOException{
String linea=r.readLine();
if (linea==null)
return 0;
else
return ((Integer.parseInt(linea)+mediaDaFile(r))/2);
}
Questo dovrebbe risolverti il problema: quando arriva alla fine dello stream, torna 0, in modo che al livello superiore dello stack di invocazione ci sia la media calcolata prima + 0 = media calcolata prima; e così via. Provalo e facci sapere (io non ho avuto tempo di mettermi con Eclipse ma sono piuttosto sicuro che vada benone!)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.