Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    11

    Problema java.nullpointer

    salve, ho un problema con questo codice:
    codice:
    public void inserimento (NodoPFFS<T> New1, NodoPFFS<T> temp1){
    		NodoPFFS<T> vuoto = new NodoPFFS<T>();
    		vuoto.setFrat(null);
    		temp1.addFigl(New1);
    		temp1=temp1.getFigl();
    		while(temp1.SiFra()==true)
    			temp1=temp1.getFrat();
    		temp1.setFrat(New1);
    		System.out.println("Elemento"+New1.getEl()+"inserito con successo");
    	}
    precisamente dentro il while, mi da nullpointer exception,
    nn riesco a capire perchè, visto che il metodo siFra dovrebbe funzionare:
    codice:
    		public boolean SiFra(){
    		if(fratello==null)
    			return(false);
    		else
    			return(true);
    	}
    posto anche tutto il codice delle due classi:
    codice:
    import java.util.*;
    public class NodoPFFS<T> {
    	
    	private T ele;
    	LinkedList<NodoPFFS<T>> figli = new LinkedList<NodoPFFS<T>>();
    	private NodoPFFS<T> fratello;
    	
    	
    	public NodoPFFS(){
    		ele=null;
    	}
    	
    	public void setEl(T e){
    		ele=e;
    	}
    	
    	public T getEl(){
    		return ele;
    	}
    	
    	public void setFrat(NodoPFFS<T> fra){
    		fratello=fra;		
    	}
    	
    	public void addFigl(NodoPFFS<T> fig){
    		figli.addLast(fig);		
    	}
    	
    	public NodoPFFS<T> getFrat(){
    		return fratello;
    	}
    	
    	public NodoPFFS<T> getFigl(){
    		return figli.getFirst();
    	}
    	
    	public boolean SiFra(NodoPFFS<T> x){
    		if(x.getFrat()==null)
    			return(false);
    		else
    			return(true);
    	}
    }
    e AlberoPFFS
    codice:
    import java.util.*;
    public class AlberoPFFS<T> {
    	
    	public NodoPFFS<T> nodo,radice;
    	private int numNodi;
    	
    	public AlberoPFFS(){
    		numNodi=0;
    		radice=new NodoPFFS<T>();
    	}
    
    	public void insRadice(T x){
    		numNodi++;
    		radice.setEl(x);
    		radice.setFrat(null);
    		radice.addFigl(null);
    	}
    	
    	public void inserimento (NodoPFFS<T> New1, NodoPFFS<T> temp1){
    		NodoPFFS<T> vuoto = new NodoPFFS<T>();
    		vuoto.setFrat(null);
    		temp1.addFigl(New1);
    		temp1=temp1.getFigl();
    		while(temp1.SiFra()==true)
    			temp1=temp1.getFrat();
    		temp1.setFrat(New1);
    		System.out.println("Elemento"+New1.getEl()+"inserito con successo");
    	}
    
    	
    	public NodoPFFS<T> scorri(NodoPFFS<T> temp1,LinkedList<NodoPFFS<T>> padri1){
    		NodoPFFS<T> vuoto = new NodoPFFS<T>();
    		if(temp1.getFigl()!=vuoto.getFrat())
    			{padri1.addFirst(temp1);
    			temp1=temp1.getFigl();
    			return(temp1);}
    		if(temp1.getFrat()!=vuoto.getFrat())
    			{temp1=temp1.getFrat();
    			return(temp1);}
    		else
    			temp1=padri1.getFirst().getFrat();
    		return(temp1);
    	}
    	
    	public void insNodo (T x , T pad){
    		numNodi++;
    		int c=1;
    		LinkedList<NodoPFFS<T>> padri= new LinkedList<NodoPFFS<T>>();
    		NodoPFFS<T> temp=radice;
    		NodoPFFS<T> New= new NodoPFFS<T>();
    		New.setEl(x);
    		while(c==1){
    			if(temp.getEl()==pad){
    				inserimento(New,temp);
    				c=0;}
    			else{
    				temp=scorri(temp,padri);
    			}	
    			
    		}
    	}
    
    	public void stampa(){
    		NodoPFFS<T> vuoto = new NodoPFFS<T>();
    		int c=1;
    		LinkedList<NodoPFFS<T>> padri= new LinkedList<NodoPFFS<T>>();
    		NodoPFFS<T> temp=radice;
    		while(c==1){
    			while(temp.getFigl()!=vuoto.getFrat()){ 
    				padri.addFirst(temp);
    				temp=temp.getFigl();
    				}
    			System.out.println(temp.getEl());
    			if(temp.getFrat()!=vuoto.getFrat())
    				temp=temp.getFrat();
    			else{
    				temp=padri.getFirst().getFrat();;
    				}
    			if (padri.isEmpty())
    				c=0;
    		}
    	}
    }
    il mio problema è quello di riuscire a capire se l'attributo Fratello della classe NodoPFFS è vuoto o no. Nell'attributo Fratello si salva il puntatore al nodo successico, ma non posso confrontare un puntatore a null. Con cosa lo devo confrontare?
    spero che qualcuno mi possa aiutare;
    grazie

  2. #2
    A parte un uso strano dei generics.....
    Non ho capito, la firma di "public boolean SiFra(NodoPFFS<T> x)" è con paramtro o senza perche dopo richiami "while(temp1.SiFra()==true)" senza passare nulla....
    Poi io fratello lo dichiarerei null nel costruttore.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    11
    si scusa, quello era un errore banale, adesso il siFra l'ho messo senza parametro, cioè così:
    codice:
        public boolean siFra(){
        	if (fratello== null)
        		return false;
        	else return true;
        }
    }
    al posto di quello di prima con il parametro; e dopo aver dichiarato null il fratello nel costruttore,
    codice:
      
    public NodoPFFS(){
            ele=null;
            figli = null;
            fratello = null;
        }
    e con questo main:

    codice:
    import java.util.*;
    public class mainAlberi {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		AlberoPFFS<Integer> t = new AlberoPFFS();
    		t.insRadice(6);
    		t.insNodo(8, 6);
    		
    		
    	}
    
    }
    continua a darmi
    Exception in thread "main" java.lang.NullPointerException
    at NodoPFFS.addFigl(NodoPFFS.java:28)
    at AlberoPFFS.insRadice(AlberoPFFS.java:16)
    at mainAlberi.main(mainAlberi.java:11)

    non riesco a capire perchè;
    grazie in anticipo

  4. #4
    Prima cosa stai lavorando con oggetti di tipo T e non con interi.... ma a parte questo, che non è il motivo dell'errore, il problema è qui "radice.addFigl(null);" e poi qui "figli.addLast(fig);" non puoi passare un valore null dentro una LinkedList al massimo un oggetto vuoto come "new NodoPFFS<T>();" ma nel tuo caso non sarebbe logicamente corretto, quindi basta eliminare quella riga di codice.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    11
    grazie davvero, adesso riesco ad inserire la radice e un figlio per ogni nodo; non riesco xò ad inserire il secondo figlio...
    il costruttore del nodo adesso è così:
    codice:
        public NodoPFFS(){
            ele=null;
            fratello = null;
            figli= new LinkedList<NodoPFFS<T>>();
        }
    ma non riesco a capire perchè
    codice:
    t.insRadice(6);
    		t.insNodo(8, 6);
    		t.insNodo(5, 8);
                    t.insNodo(4, 6);
    mi aggiunge il 6, l'8 e il 5, ma non il 4; non da neanche nessun errore... semplicemente passa un monte di tempo a calcolare.


    chiaramente ho tolto
    radice.addfigl(null)...

    grazie ancora
    Mattia

  6. #6
    Ti ripeto che stai lavorando con oggetti di tipo T non con interi (int)......
    Quindi dentro al ciclo
    codice:
    if(temp.getEl()==pad){
    				inserimento(New,temp);
    				c=0;}
    			else{
    				temp=scorri(temp,padri);
    			}
    non puoi utilizzare == devi usare il metodo .equals(T) dell'oggetto che stai usando (che fra l'altro non si sa perchè T è generico quindi puoi dargli qualsiasi cosa anche le caramelle.... ) in questo modo c non diventa mai 0 e si crea un bel looppone....
    Poi per fare una bella cosa devi passare i valori cosi
    codice:
    t.insRadice(new Integer(6));
    		t.insNodo(new Integer(8), new Integer(6));
    		.....

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    11
    ho provato ad usare questo .equals();
    eppure rimango nel loop, non riesco a capire perchè...
    il metodo ora è così:

    codice:
        public void inserimento (NodoPFFS<T> New1, NodoPFFS<T> temp1){
            temp1.addFigl(New1);
            temp1=temp1.getFigl();
            while(temp1.siFra()==true){
                temp1=temp1.getFrat();}
            temp1.setFrat(New1);
            System.out.println("Elemento"+New1.getEl()+"inserito con successo");
        }
    
        public NodoPFFS<T> scorri(NodoPFFS<T> temp1,LinkedList<NodoPFFS<T>> padri1){
            if(temp1.getFigl()!=null)
                {padri1.addFirst(temp1);
                temp1=temp1.getFigl();
                return(temp1);}
            if(temp1.getFrat()!=null)
                {temp1=temp1.getFrat();
                return(temp1);}
            else
                temp1=padri1.getFirst().getFrat();
            return(temp1);
        }
    
        public void insNodo (T x, T pad){
        	numNodi++;
            int c=1;
            LinkedList<NodoPFFS<T>> padri= new LinkedList<NodoPFFS<T>>();
            NodoPFFS<T> temp=radice;
            NodoPFFS<T> New= new NodoPFFS<T>();
            New.setEl(x);
            while(c==1){
                if(temp.getEl().equals(pad)){
                    inserimento(New,temp);
                    c=0;}
                else{
                    temp=scorri(temp,padri);
                }
    
            }
    proprio non riesco a capire perchè non esco dal loop.
    grazie ancora
    mattia

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    11

    Problema linked list equals

    smanettandoci un pochino sono giunto alla conclusione che il problema è nel riuscire a capire se una linkedlist (quella dei figli in questo caso) è vuota o meno...
    qualche suggerimento???

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.