Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    15

    Errore : Exception in thread "main" java.lang.NullPointerException

    Buongiorno a tutti.
    Sono uno studente di ingegneria elettrica, e sto tentando di risolvere un'esercizio, in preparazione dell'esame di programmazione in java.
    In sostanza, devo leggere questo file :
    1 duecento
    600 cento
    3 mille
    6 duemila
    Memorizzarlo in strutture dati oppurtune ( utilizzo il vettore) e poi stamparlo a video, ossia vedere a video il contenuto del file (file di testo .txt).
    Ecco cosa ho prodotto :


    codice:
    // Prova del 5/9/2012
    
    public class Cifra {
    	int num;
    	String quantita;
    	public Cifra(int num,String quantita){
    		this.num=num;
    		this.quantita=quantita;
    }
    		public String toString(){
    			return num+"\t"+quantita;
    			}
    
    			public int getnum(){
    				return num;
    				}
    			public String getquantita(){;
    			return quantita;
    			}
    
    		}
    // Prova del 5/9/2012
    
    public class Cifra {
    	int num;
    	String quantita;
    	public Cifra(int num,String quantita){
    		this.num=num;
    		this.quantita=quantita;
    }
    		public String toString(){
    			return num+"\t"+quantita;
    			}
    
    			public int getnum(){
    				return num;
    				}
    			public String getquantita(){;
    			return quantita;
    			}
    
    		}
    E poi :

    codice:
    import java.io.*;
    import java.util.*;
    import java.util.StringTokenizer;
    
    public class Testo {
    	int num;
    	String quantita;
    	int numRighe;
    	int i;
    	int j;
    
    	Cifra[]vet;
    
    	public Testo(){
    		vet=new Cifra[numRighe];
    		}
    
    //effettuo la lettura
    
    
    	public void leggi(String nomeFile)throws IOException {
    		String line;
    		BufferedReader br=new BufferedReader(new FileReader (nomeFile));
    		i=0;
    
    		while ((line=br.readLine())!=null) {
    		i++;
    		}
    		numRighe=i;
    		vet=new Cifra [numRighe];
    		i=0;
    		br.close();
    		br=new BufferedReader(new FileReader (nomeFile));
    		br.readLine();
    
    		while ((line=br.readLine())!=null) {
    				StringTokenizer st;
    				st=new StringTokenizer(line);
    				
    				vet[i]=new Cifra (num,quantita);
    				i++;
    		}
    }
    
    public void stampa () throws IOException {
    System.out.println ("IL FILE CONTIENE:\n");
              for (int j=0; j<vet.length ; j++){
                  
                vet[j].toString();
            
                  }	
             }	
    
    public static void main(String[]args)throws IOException {
    	Testo vet=new Testo();
    
    	String nomeFile="esegui.txt";
    	if(args.length==1)
    		nomeFile=args[0];
    
    		vet.leggi(nomeFile);
    		vet.stampa();
    
    		}
    
    }
    Ho compilato tramite terminale del mac, tutto ok, quando lo eseguo, mi esce il seguente errore:

    Exception in thread "main" java.lang.NullPointerException
    at Testo.stampa(Testo.java:49)
    at Testo.main(Testo.java:62)

    Io, credo di aver capito, che sia un problema di array, poichè non me lo stampa a video.
    Tuttavia ho provato di tutto, ma non sono riuscito a risolvere.
    Spero mi possiate aiutare, grazie

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Quali sono le righe 49 e 62?


  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Subdolo, ma l'ho scovato.
    Nel metodo leggi() tu fai questo:

    codice:
    ...
    br=new BufferedReader(new FileReader (nomeFile));
    br.readLine();
    
    while ((line=br.readLine())!=null) {
       StringTokenizer st;
       ...
    }
    Quella riga in grassetto si mangia la prima riga. Quindi, tu inizializzi l'array "vet" con tante righe quante sono quelle del file... ma crei un oggetto in meno... ovvero, l'ultimo elemento dell'array non viene creato perchè in quel while fai un iterazione in meno.

    Togli di mezzo quella riga e "tutto funziona".

    L'ho messo tra virgolette perchè in realtà non vedrai stampare nulla visto che l'istruzione

    codice:
    vet[j].toString();
    Non fa nulla... il metodo toString() restituisce una stringa, ma tu la butti via... forse volevi mettere quell'istruzione in un System.out.println().

    Ci sono anche altri errori (ad esempio, non chiudi il file dopo averlo letto la seconda volta) e altre cose da sistemare (qui alcune):

    1) Gestione della lettura di un file (vedi questo mio intervento in merito)

    2) Tante istruzioni di assegnamento ridondanti

    3) Leggi il file, ma del contenuto non ne fai nulla... gli oggetti Cifra li crei tutti con i valori (nulli) delle variabili di istanza "num" e "quantita" che non valorizzi da nessuna parte


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    C'è una readLine() di troppo...

    edit: ho lasciato la finestra di risposta troppo a lungo XD quoto tutto quello che ha detto leleFT
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    15
    Originariamente inviato da LeleFT
    Subdolo, ma l'ho scovato.
    Nel metodo leggi() tu fai questo:

    codice:
    ...
    br=new BufferedReader(new FileReader (nomeFile));
    br.readLine();
    
    while ((line=br.readLine())!=null) {
       StringTokenizer st;
       ...
    }
    Quella riga in grassetto si mangia la prima riga. Quindi, tu inizializzi l'array "vet" con tante righe quante sono quelle del file... ma crei un oggetto in meno... ovvero, l'ultimo elemento dell'array non viene creato perchè in quel while fai un iterazione in meno.

    Togli di mezzo quella riga e "tutto funziona".

    L'ho messo tra virgolette perchè in realtà non vedrai stampare nulla visto che l'istruzione

    codice:
    vet[j].toString();
    Non fa nulla... il metodo toString() restituisce una stringa, ma tu la butti via... forse volevi mettere quell'istruzione in un System.out.println().

    Ciao.
    Grazie mille, in effetti è come dici tu. Il problema è stato risolto, tuttavia, ora mi da questo risultato :
    codice:
    IL FILE CONTIENE:
    0	null
    IL FILE CONTIENE:
    0	null
    IL FILE CONTIENE:
    0	null
    IL FILE CONTIENE:
    0	null
    Tale risultato, l'ho ottenuto modificando quanto segue :
    codice:
    public void stampa () throws IOException {
    
              for (int j=0; j<vet.length ; j++){
    	  System.out.println ("IL FILE CONTIENE:\n"+ vet[j].toString());
                  
                        
                  }	
             }
    Ora, date le tue utilissime spiegazioni, capisco di aver sbagliato qualcosa, nell'assegnazione delle variabili, ma non so proprio come porre rimedio.
    Potresti aiutarmi, ulteriormente ?
    Scusa se utilizzo un lessico non troppo adatto, ma non sono per niente pratico, e sto facendo una fatica mostruosa per tentare di capire questo linguaggio, al fine di raggiungere un buon risultato all'esame.
    Grazie.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    15
    Ok, sono riuscito a risolvere !
    Ora, volendomi spingere piu in la, se volessi stamare a video, solo una parte di file, mi basta inserire un ciclo if, all'interno del void stampa, sotto il for ?

  7. #7
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Sì esatto, sarà una cosa del tipo

    codice:
    if(condizioneCheVuoi) {
        stampa;
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    15
    Ragazzi sto provando a fare un altro esercizio sulla falsa riga di quello sopra.Il file da leggere è:
    codice:
    3 
    1 880 600 Anna Anna 
    2 830 678 Luca Anni 
    3 223 610 Paolo Errore
    Il programma scritto è il seguente:
    codice:
    public class Listone {
     int numimmagini; 
    int cod; 
    int larg; 
    int alt; 
    String nome;
     public Listone(int numimmagini,int cod,int larg, int alt,String nome){ this.numimmagini=numimmagini; 
    this.cod=cod; this.larg=larg; 
    this.alt=alt; 
    this.nome=nome; 
    }
     public String toString(){
     String descrizione; 
    descrizione= numimmagini+"\n"+cod+"\t"+larg+"\t"+alt+"\t"+nome;
     return descrizione; 
    }
     public int getnumimmagini(){ 
    return numimmagini; 
    } 
    public int getcod(){ 
    return cod; 
    } 
    public int getlarg(){ 
    return larg;
     } 
    public int getalt(){ 
    return alt; 
    } 
    public String getnome(){
    return nome; 
    }
     }
    parte operativa:
    codice:
    import java.io.*;
    import java.util.*;
    import java.util.StringTokenizer;
    public class Esecuzione {
    	int numimmagini;
    	int cod;
    	int larg;
    	int alt;
    	String nome;
    	int i;
    	int numRighe;
    	Listone[]vet;
    	public Esecuzione(){
    		vet=new Listone[numRighe];
    		}
    	public void leggi(String nomeFile)throws IOException {
    		String line;
    		BufferedReader br=new BufferedReader(new FileReader (nomeFile));
    		i=0;
    		while ((line=br.readLine())!=null) {
    		i++;
    		}
    		numRighe=i;
    		vet=new Listone [numRighe];
    		i=0;
    		br.close();
    		br=new BufferedReader(new FileReader (nomeFile));
    		while ((line=br.readLine())!=null) {
    				StringTokenizer st;
    				st=new StringTokenizer(line);
    				int numimmagini=Integer.parseInt(st.nextToken());
    				int cod=Integer.parseInt(st.nextToken());
    				int larg=Integer.parseInt(st.nextToken());
    				int alt=Integer.parseInt(st.nextToken());
    				String nome=st.nextToken ();
    				vet[i]=new Listone (numimmagini,cod,larg,alt,nome);
    				i++;
    		}
    }
    public void stampa () throws IOException {
          for (int j=0; j<vet.length ; j++){
    	  System.out.println ("IL FILE CONTIENE \t:"+vet[j].toString() );
                  }
             }
    public static void main(String[]args)throws IOException {
    Esecuzione vet=new Esecuzione();
    String nomeFile="eseguilo.txt";
    	if(args.length==1)
    		nomeFile=args[0];
    		vet.leggi(nomeFile);
    		vet.stampa();
    		}
    }
    tuttavia mi da ancora questo errore:

    codice:
    Exception in thread "main" java.util.NoSuchElementException
     at java.util.StringTokenizer.nextToken(StringTokenizer.java:349) 
    at Esecuzione.leggi(Esecuzione.java:32)
     at Esecuzione.main(Esecuzione.java:50) 
    Premere un tasto per continuare . . .
    gentilmente mi potreste aiutare a risolvere il problema?
    So che il problema è il medesimo di prima(almeno credo) ma non riesco proprio a risolvere,grazie mille!

  9. #9
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Quali sono le righe 32 e 50?

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    15
    riga 32 : int cod=Integer.parseInt(st.nextToken());
    riga 50 : vet.leggi(nomeFile);

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.