Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258

    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");
    }
    }

  2. #2
    Non è un'eccezione diciamo da gestire con un try catch o cose simili qui ti da questo errore alla riga 41 del tuo codice perchè tenti di accedere ad una casella dell'array che ha valore null e quindi ti ritorna errore perchè in sostanza tenti di accedere al niente.

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258
    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?

  4. #4
    Controlla che nella variabile tok ci sia dentro qualcosa prima di usarla per creare x.

    codice:
    StringTokenizer tok=new StringTokenizer(br.readLine(),""); 
    System.out.println(tok); 
    x[i][j]=Double.parseDouble(tok.nextToken().trim());//
    Vedi cosa ti stampa...e se è vuota o null o ti da ancora l'errore controlla se br.readLine() restituisce qualcosa di valido.

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258
    Il println del tok non mi dà nulla, mentre quello del br.line va bene.
    Il problema è nel tok, come lo posso risolvere?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258
    Scusa Matteo982 volevo chiederti una cosa.
    In realtà questa procedura deve restituirmi il valore double di ogni token e crearmi così un array bidimensionale con questi valori double.
    Sapresti 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?
    Ti prego aiutami....

  7. #7
    Scrivimi qui esattamente cosa restituisce br.readLine() così vediamo un po' di far qualcosa di alternativo se si può.

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258
    Grazie per la disponibilità...prima di postarti i risultati vorrei che mi aiutassi (sempre se ti va) ad analizzare il codice che ho scritto per questa funzione.
    Quello originale prevedeva un file di 2 colonne fisse e numero di righe variabili.
    Sto cercando di migliorare giorno dopo giorno col java e i tuoi aiuti mi sono veramente utili.
    Ti ricordo che la funzione dovrebbe prendere in ingresso un file txt del tipo

    nome dato dato dato....
    xyz 23.4 345...............

    e caricarlo, dopo averne riconosciuto numero righe e colonne, in un array bidimensionale di double.
    Uno dei miei dubbi è:
    come avviene la trasformazione della prima colonna che è di tipo stringa?
    Nel codice originale che sto riadattando le colonne erano tutte numeriche,posso usare Double.Parse...per una colonna di tipo stringa?
    Il codice era(il numero di righe era calcolato precedentemente e passato come parametro)


    public double[][]ReadArray(int Nrows)throws IOException
    {
    FileReader fr=new FileReader(fileName);
    BufferedReader in=new BufferedReader(fr);
    double[][] x=new double[Nrows][2];

    double[][]x=new double[Nrows][Ncolumns];
    for(int i=0; i<Nrows; i++)
    {
    StringTokenizer tok=new StringTokenizer(in.readLine(),"");
    x[i][0]=Double.parseDouble(tok.nextToken().trim());
    x[i][1]=Double.parseDouble(tok.nextToken().trim());
    }
    in.close();

    for(int j=0; j<Nrows; j++)
    {
    System.out.println(x[j][0]+""+x[j][1]);
    }

    return x;
    }


    Questo stesso codice devo "adattarlo"(potrei anche cambiarlo se ne fossi capace...) ad un problema analogo ma con numero di colonne variabili(non più 2 ) e numero righe variabili.
    Il problema l'ho risolto in un'altra funzione che passa direttamente numero righe e colonne.
    Anche l'operazione di FileReader e BufferedReader l'ho messa nel main perchè comune a più funzioni.
    Il mio codice è questopasso al metodo numero righe,colonne e br caricato nel main).


    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++)
    {
    StringTokenizer tok=new StringTokenizer(br.readLine(),"");
    x[i][j]=Double.parseDouble(tok.nextToken().trim());/*restituisce il valore double rappresentato dalla stringa(token) */
    }
    }
    br.close();


    for(int i=0; i<Nrows; i++)
    {
    for(int j=0; j<Ncolumns; j++)
    {
    System.out.println(x[i][j]);
    }
    }
    return x;
    }

    Sbaglio qualcosa?
    In questa situazione l'errore è

    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:47)
    at AddDb.main(AddDb.java:90)


    Il main è:
    public static void main(String[] args)throws IOException {
    FileReader file = new FileReader(fileName);
    BufferedReader br = new BufferedReader(file);
    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");
    }


    Ringrazio in anticipo chi mi aiuterà....

  9. #9
    In sostanza tutta sta roba si riassume nel fatto che tu devi fare un metodo che prende i dati dal file di testo e li mette in un vettore bidimensionale...e il numero di righe e colonne del file è variabile...ho capito giusto?

    Prima di tutto bisognerebbe risolvere l'errore che ti da, quindi prova a postare il contenuto di in.readLine() e giusto per curiosità, prova a fare una piccola modifica

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258
    Hai capito bene il problema e l'array deve essere di double....

    Ti posto il contenuto di line che è la stringa in cui viene copiato br.readLine...

    ProbesetID MAO.CEL MAO1.CEL MAO2.CEL MAM.CEL
    MAM1.CEL MAM2.CEL ZAR.CEL ZOR.CEL ZOR1.CEL
    ZOE.CEL ZOE1.CEL ZOE2.CEL
    Il numero di colonne e' :13
    Il numero di righe e' :2


    Ho messo degli spazi casuali nel file originario per testare se mi variasse il numero di colonne o meno...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.