Newsgroup: it.comp.java
Titolo: Come gestire questa eccezione???

Salve a tutti,
vorrei chiedervi un aiuto.
Non riesco a gestire correttamente un'eccezione.
Chi può aiutarmi ad eliminarlo?
Grazie
L'errore che ottengo a livello di esecuzione è:
Exception in thread "main" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at AddDb.ReadArray(AddDb.java:41)
at AddDb.main(AddDb.java:74)
Il codice che ho sviluppato è il seguente:
import java.util.*;
import java.io.*;
public class AddDb {
private static String fileName="Affymetrix_dati.txt";
private static int Ncolumns=0;
private static int Nrows=0;
/*AddDb(String fN)//Il costruttore della classe
{
fileName=fN;
}*/
public int ColumnsNumber(BufferedReader br)throws IOException {
String line = br.readLine(); //legge una linea di testo terminata da /n
o /r e la restituisce come stringa
StringTokenizer st = new StringTokenizer(line); /*La classe
StringTokenizer permette la divisione di una
stringa in tokens (Il tokenizer usa il set di delimitatori di default ,
che è " \t\n\r\f": lo spazio, il tab, l'invio.
I delimitatori non vengono trattati come token.*/
Ncolumns=st.countTokens(); //calcola il numero di token,in questo caso
è il numero di colonne
return Ncolumns;
}
public int RowsNumber(BufferedReader br)throws IOException {
String line = br.readLine();
while (line != null) { //ciclo che conta il numero di righe
arrestandosi al null che indica la fine del file
Nrows++;
line = br.readLine();
}
return Nrows;
}
public double[][]ReadArray(int Nrows,int Ncolumns,BufferedReader
br)throws IOException
{
double[][]x=new double[Nrows][Ncolumns];
for(int i=0; i<Nrows; i++)
{
for(int j=0; j<Ncolumns; j++)
{
try
{
StringTokenizer tok=new StringTokenizer(br.readLine(),"");
x[i][j]=Double.parseDouble(tok.nextToken().trim());//resituisce il
valore double rappresentato dalla stringa(token).
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
}
br.close();
for(int i=0; i<Nrows; i++)
{
for(int j=0; j<Ncolumns; j++)
{
System.out.println(x[i][j]);
}
}
return x;
}
public static void main(String[] args)throws IOException {
FileReader file = new FileReader(fileName); //classe per la lettura di
file di caratteri
BufferedReader br = new BufferedReader(file); /*Legge testo da uno
stream di caratteri di ingresso,
bufferizzando i caratteri in maniera da garantire efficienza di
lettura.*/
double[][]Array;
AddDb db=new AddDb();
db.ColumnsNumber(br);
System.out.println("Il numero di colonne e' :"+Ncolumns);
db.RowsNumber(br);
System.out.println("Il numero di righe e' :"+Nrows);
System.out.println("Caricamento dell'array di double in corso.....");
try
{
System.out.println(db.ReadArray(Nrows,Ncolumns,br));
}
catch(IOException e){
System.out.println(e.getMessage());
}
System.out.println("Fatto");
}
}

Così a naso, vedo che non sempre controlli l'End Of File. Il che vuol
dire che quando ci arrivi, readLine ti restituisce null e tu cerchi di
tokenizzare null.

 at java.util.StringTokenizer.<init>(Unknown Source)
Probabilmente passi al costruttore di StringTokenizer una stringa che e' 
null.
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

sì....ma non mi continua l'esecuzione della funzione e commentando il
codice ho visto che si ferma all'inizio di
StringTokenizer tok=new StringTokenizer(br.readLine(),"");
x[i][j]=Double.parseDouble(tok.nextToken().trim());//
Come faccio per risolvere il problema?

Scusate ragazzi, volevo chiedervi una cosa.
In realtà questa procedura(cioè la ReadArray) deve restituirmi il
valore double di ogni token e crearmi così un array bidimensionale con
questi valori double.
Sapreste consigliarmi un metodo alternativo se non riesco a risolvere
così?
Questa procedura me l'ha passata un tizio che aveva risolto il mio
problema per un file con varie righe ma solo 2 colonne. Io l'ho
adattata per numero variabile di colonne e soprattutto a lui erano solo
colonne di decimali, a me la prima colonna è una stringa(una specie di
codice fiscale..)
Può essere questo il problema?
Vi prego aiutatemi....

 at AddDb.ReadArray(AddDb.java:41)
Hai provato almeno ad isolare cosa succede alla riga 41?
Lo stacktrace indica la riga di sorgente dove l'eccezione è scatenata.
Il tipo di eccezione indica che viene usato un'oggetto non
inizializzato o a null.
La NullPointerException non va gestita, va prevenuta. Una volta
individuato qual'è il reference che in quella riga è a null decidi
cosa fare sulla base della logica del tuo programma.

 ... ...
sposta
try {
  StringTokenizer tok=new StringTokenizer(br.readLine(),"");
catch(IOException e) {
  System.out.println(e.getMessage());
}
nel primo for
ciao