A> do {
A> track.readLine();
A> StringTokenizer string =new StringTokenizer(track.readLine());
A> num1.add(idx, Double.parseDouble(string.nextToken()));
A> num2.add(idx, Double.parseDouble(string.nextToken()));
A> num3.add(idx, Double.parseDouble(string.nextToken()));
A> num4.add(idx, Double.parseDouble(string.nextToken()));
A> idx++;
A> } while (track.readLine() != null);
Leggi 3 righe a ciclo, e` giusto ?
E perché usi uno StringTokenizer e non il metodo split di String ?
Un paio di righe dell'input non farebbero male...
--
/\ ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
//--\| | \| | Integralista GNUslamico
\/ e coltivatore diretto di Software
a parte questo, il suo problema e' qui:
StringTokenizer string =new StringTokenizer(track.readLine());
perche' ha problemi ad inizializzare il tokenizer:
java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
cito (dalle API):
<cite>
StringTokenizer
public StringTokenizer(String str)
Constructs a string tokenizer for the specified string. The
tokenizer uses the default delimiter set, which is " \t\n\r\f": the
space character, the tab character, the newline character, the
carriage-return character, and the form-feed character. Delimiter
characters themselves will not be treated as tokens.
Parameters:
str - a string to be parsed.
Throws:
NullPointerException - if str is null
<\cite>
quindi il problema e' che track.readLine() non ritorna una stringa
come vorrebbe il Tokenizer (credo).
Angela, sei sicura che track.ReadLine() legga qualcosa? prova a fare
un System.out.println(track.readLine()); tanto per vedere se legge
giusto.
Poi al Tokenizer (se non vuoi usare .split()) io passerei i token di
separazione dei campi (spazio,tab,ecc.) e non un alinea letta dal
file.
Ciao Jack
A> Num1 Num2 Num3 Num4 Num5 Num6 Num7 Num8 Num9 Num10 Num11 Num12
A> Num13 Num14 Num15 Num16 Num17 Num18 Num19 Num20 stato 0.00000E+00
A> 1.468 3.752 2.664 8.070 4.299 0.925 5.55E-2 2.43E-3 0.2561 0.8681
A> 1.147 0.8575 0.9287 1.187 0.0000 0.0982 0.000 -1.930 0.0000 a= 0.55
A> b=0.019 c=0.2 1.67857E+06 1.494 3.738 2.584 8.071 4.303 0.900
A> 7.96E-2 3.55E-3 0.2650 0.8789 1.162 0.8575 0.9221 1.228 0.0000
A> 0.0982 0.000 -1.904 0.0000 7.29263E+06 1.514 3.732 2.539 8.074
A> 4.299 0.839 1.35E-1 7.97E-3 0.2825 0.8845 1.186 0.8575 0.8938 1.244
A> 0.0000 0.1063 0.000 -1.884 0.0000 Te-m
A> per chiarire un pò questo input, a me non servirà mai la colonna
A> stato (che nel primo rigo ha come valori a= 0.55 b=0.019 c=0.29 e
A> nel terzo Te-m). Magari per vederlo meglio conviene fare il copia
A> incolla usando wordpad.
A> Cmq la mia idea era la seguente: leggere la prima riga e scartarla,
A> dalla seconda in poi leggere la riga, salvare i primi 4 double e
A> saltare alla riga successiva, questo finchè non finisce il file. Il
Mi sa che hai sbagliato il loop tanto per cominciare, A-chan.
A> do {
// Questa dovresti eseguirla una sola volta, non ogni ciclo
A> track.readLine();
// questa potrebbe andare bene
A> StringTokenizer string =new StringTokenizer(track.readLine());
A> num1.add(idx, Double.parseDouble(string.nextToken()));
A> num2.add(idx, Double.parseDouble(string.nextToken()));
A> num3.add(idx, Double.parseDouble(string.nextToken()));
A> num4.add(idx, Double.parseDouble(string.nextToken()));
A> idx++;
//Ma questa butta via una riga....
A> } while (track.readLine() != null);
Jack aveva colpito bene che fosse la creazione dello StringTokenizer,
ma il problema sorge da come è fatto il loop.
Supponiamo che l'input sia
Num1 Num2 Num3 Num4 Num5
0.00000E+00 1.468 3.752 2.664 8.070
1.67857E+06 1.494 3.738 2.584 8.071
7.29263E+06 1.514 3.732 2.539 8.074
Il tuo codice scarta Num1... Num5, crea il tokenizer con la riga 1,
scarta la riga 2 (test nel while), scarta la 3 e prova a creare un
tokenizer con un input nullo... Kaboooooom!
Per il resto, purtroppo ora come ora non ho molto tempo per i test...
A> for (int i = 0; i < n; i++) {
A> track.nextLine();
A> String checkline=track.nextLine();
}
Angela,
cosa ti hanno fatto di male le righe pari del file di input :) ?
Si dopo aver aperto e usato il file con il LineBufferedReader e prima
di usare lo Scanner devi chiudere il file, altrimenti lo Scanner lo
vede gia' a perto da qualcos'altro e non sa cosa fare.
A> GianUberto...finalmente ho capito(forse!):
Direi di si, il loop mi pareva corretto.
Ah, la documentazione dice che l'eccezzione che ti becchi viene
sollevata se il numero non rispetta l'espressione regolare per numeri
floating point o è fuori range.