Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problema java.lang.NullPointerException

    ciao ragazzi, sono due giorni che tribolo dietro ad eclipse.. in passato ho programmato con il c++ il delphi ed ora mi sono dato al java per via di un progetto dell'università (che tra l'altro ho visto che è stato già postato in questo forum). Ora passando al mio problema, devo scrivere un codice che fa determinate funzioni legate ad un albero, quindi io mi sono creato una classe Nodo:
    codice:
    public class NodoLF<T> {
    
    	private T data;
    	private NodoLF<T> primoFiglio;
    	private NodoLF<T> prossimoParente;
    	private NodoLF<T> genitore;
    	
    	//costruttori
    	
    	public NodoLF(){
    
    	}
    	
    	public NodoLF(T data){
    		this.data=data;
    	}
    	
    	public NodoLF(NodoLF<T> nodo){
    		this.data=nodo.getData();
    		this.primoFiglio=nodo.getPrimoFiglio();
    		this.prossimoParente=nodo.getProssimoParente();
    		this.genitore=nodo.getGenitore();
    	}
    	
    	//gettatori
    	public T getData(){
    		return this.data;
    	}
    	
    	public NodoLF<T> getPrimoFiglio(){
    		return this.primoFiglio;
    	}
    	
    	public NodoLF<T> getProssimoParente(){
    		return this.prossimoParente;
    	}
    	
    	public NodoLF<T> getGenitore(){
    		return this.genitore;
    	}
    ora il mio problema giunge quando vado ad utilizzare le funzioni di get, ogni qualvolta che con il debug arrivo a quel punto l'operazione si interrompe e mi restituisce l'eccezione java.lang.NullPointerException in varie locazioni, che però riconducono alla fine ad una funzione di get (a seconda di quale il debug trova per prima sulla sua strada)

    Adesso ho letto in vari forum inglesi che questo errore viene restituito quando cerco di utilizzare al posto di un oggetto un null, ma effettivamente è quello che faccio, se un oggetto non esiste io devo utilizzare un null, e in caso di necessità istanzio un nuovo NodoLF<T>, ma il problema non si pone perché il programma mi sputa fuori prima di poterlo fare ed, ovviamente, se lo istanzio dentro al costruttore questo mi va in loop (ogni volta che istanzio un nodo me ne istanzia altri 3, quindi 9, quindi 27 etcetc senza mai finire)
    Qualche idea?

  2. #2
    Un oggetto inizializzato a null non è istanziato (tramite new), pertanto ogni tentativo di richiamarne un metodo solleva il NullPointerException.
    E' la stessa cosa in c++ di dichiarare un puntatore ad oggetto valorizzandolo a null e cercare di deferenziarlo.
    ...

  3. #3
    innanzi tutto grazie per la risposta
    adesso fammi capire.. per risolvere il problema devo far si che quando utilizzo, per esempio, il metodo

    codice:
    public Nodo<T> getPrimofiglio(){
                          return this.primoFiglio;
    }
    devo fare un controllo per evitare che getPrimofiglio mi ritorni un valore null e nel caso istanziare un nuovo nodo, tipo:

    codice:
    public Nodo<T> getPrimofiglio(){
                       if (this.primofiglio==null)
                            return new Nodo<T>();
                       else
                             return this.primofiglio;   
    }
    però mi continua a dare lo stesso errore nello stesso punto, come se anche così il nuovo nodo figlio sia null

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Posta il codice del metodo main.

  5. #5
    ok grazie a questo punto posto il codice nell'ordine in cui lo legge il debug...
    allora sono un pollo, ho trovato il bandolo della matassa, mentre riscrivevo qui il codice mi sono accorto cosa mancava!! Comunque a scopo informativo lo riporto comunque!

    main:
    codice:
    import java.util.*;
    public class TestAlberiLF {
    
    	
    	public static void main(String[] args){
    
    
    		AlberoLF<Integer> tree=new AlberoLF<Integer>();
    		
    		NodoLF<Integer> root=tree.addRoot(9);
    classe AlberoLF<T>
    codice:
    public class AlberoLF<T> {
    	       private NodoLF<T> root;
                   [.....]
                    //Metodo addRoot, aggiunge il valore data di tipo T ad un nuovo oggetto ti tipo Nodo
            	public NodoLF<T> addRoot(T data){
    		NodoLF<T> tmp=new NodoLF<T>(data);
    		addNode(null,tmp);
    		return tmp;
    	}
    
                    //Metodo addNode, aggiunge alla coda di un nodo preesistente (o null in questo caso
            public NodoLF<T> addNode(NodoLF<T> nodoOld, NodoLF<T> nodoNew){
                   if (nodoOld==null)//mancava questo
                            nodoOld=new NodoLF<T>();//e questo
    		nodoNew.setGenitore(nodoOld);
    		if(nodoOld.getPrimoFiglio()==null){
    			nodoOld.setPrimoFiglio(nodoNew);
    			return nodoNew;
    		}
    		else
    			nodoOld=nodoOld.getPrimoFiglio();
    		
    		while (nodoOld.getProssimoParente()!=null){
    			nodoOld=nodoOld.getProssimoParente();
    		}
    		nodoOld.setProssimoParente(nodoNew);
    		return nodoNew;
    	}
            //setGenitore, passando al metodo un nodo il metodo lo collega ad un nodo precedente
    	public void setGenitore(NodoLF<T> nodo){
    		this.genitore=nodo;
    	}

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.