PDA

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

sic2
26-11-2011, 20:52
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

webking
28-11-2011, 10:25
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!)