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

    java.lang.NullPointerException

    Sto cercando di esercitarmi con la classica classe punto, ma ho un'eccesione, in oggetto indicato, che non riesco a risolvere.

    codice:
    public class NodeTest {
    
      public static void main(String argv[]) {
    	
    	//inerisce nell'array Nodes tre oggetti Node
    	Node[] nodes = new Node[150];
    	double d;	//distanza
    	double r; 	//raggio
    	int l = 350;	//Lunghezza Area
    	int a = 500;	//Altezza Area
    	double Nd;	//numeri di nodi generati da una sequqnza casuale
    	Integer i;	//buffer
    	int k,q;	//indice
    	boolean flag = true;
    	NumberFormat formattatore = NumberFormat.getNumberInstance();  // cultura predefinita
    	
    	formattatore.setMaximumFractionDigits(2); // max due cifre decimali dopo la virgola
    	
    [...]	
    
    	//posiziona i nodi nel piano in modo casuale
    	for(k=0;k<Np;k++){
               nodes[k]= new Node(Math.random()*(a-30)+15, Math.random()*(l-30)+15);
             }//for k
             
    	
    	//stampa l'informazione su tutti gli oggetti Employee
    	for(k = 0; k < nodes.length; k++){
    		Node e = nodes[k];
    		e.setId();
    		r = e.getR();
    		//e.setR(-2);
    		//double r2 = e.getR();
    		d = e.getD(nodes[0].getX(), nodes[0].getY());
    		 // imposto il formattatore con le specifiche desiderate
    		System.out.println("id="+formattatore.format(e.getId())
    			+ "\t (" + formattatore.format(e.getX()) + ";" + formattatore.format(e.getY()) 
    			+ ") \t raggio=" + formattatore.format(r)
    			+ " \t d = " + formattatore.format(d));
    		nodes[k] = e;
    	}//for k
    
    //verifica copia NON VIENE VISUALIZZATA
    
    	for(k = 0; k < nodes.length; k++){
           		 // imposto il formattatore con le specifiche desiderate
           		System.out.println("***DEBUG nodes["+formattatore.format(nodes[k].getId())
           			+ "]\t (" + formattatore.format(nodes[k].getX()) + ";" + formattatore.format(nodes[k].getY()) 
           			+ ") \t raggio=" + formattatore.format(nodes[k].getR())
           			+ " \t d = " + formattatore.format( nodes[k].getD( nodes[0].getX(), nodes[0].getY() ) ) );
           	}//for k
    	[...]	
      }//main
      
    }//NodeTest
    
    class Node{
    	
    	/**
    		costruottore per la classe Node
    		@param a ascissa di tipo double
    		@param b coordinata di tipo double
    		@return istanza oggetto di tipo Node
    	*/
    	public Node(double a, double b){
    		x = a;
    		y = b;
    		id = 0;
    		r = 10.0+100.0*Math.random();
    		v = null;
    	}//Node
    	
    	/**
    		costruottore per la classe Node
    		@param a ascissa di tipo double
    		@param b coordinata di tipo double
    		@param c codice identificativo di tipo intero
    		@param d raggio di azione;
    		@return istanza oggetto di tipo Node
    	*/
    	public Node(double a, double b, int c, double d){
    		x = a;
    		y = b;
    		id = c;
    		r = d;
    	}//Node
    	
    	/**
    		@return l'ascissa di tipo double
    	*/
    	public double getX(){
    		return x;
    	}//getX
    	
    	/**
    		@return l'ordinata di tipo double
    	*/
    	public double getY(){
    		return y;
    	}//getY
    	
    	/**
    		@return il codice identificativo del nodo
    	*/
    	public double getId(){
    		return id;
    	}//getId
    	
    	/**
    		determina il codice identificativo di un nuovo nodo
    	*/
    	public void setId(){
    		id = nextId;
    		nextId++;
    	}//setId
    	
    	/**
    		@return il codice identificativo di un nuovo nodo
    	*/
    	public static int getNextId(){
    		return nextId;
    	}//getNextId
    	
    	/**
    		@return il raggio d'azione del nodo
    	*/
    	public double getR(){
    		return r;
    	}//getR
    	
    	/**
    		modifica il raggio di azione del nodo
    	*/
    	public void setR(double dd){
    		double d = dd;
    		r += d;
    	}//setR
    	
    	/**
    		distanza tra il nodo corrente ed in nodo in ingresso
    		@param d1 l'ascissa di tipo double
    		@param d2 l'ordinata di tipo double		
    		@return la distanza tra due nodi
    	*/
    	public double getD(double d1,double d2){
     		double dw;
            	dw=Math.pow(Math.pow(x-d1,2.0)+Math.pow(y-d2,2.0),0.5);
            	return dw;
      	}//d
      	
      	
      	/**
    		inserisce un vicino ovvero un nodo raggiunto
    	*/
    	public void setV(Node a){
    		 v.add(a);	//inserisce un oggetto nella lista
    	}//setV
    	
    	/**
    		restituisce la lista dei vicini ovvero dei nodi raggiunti
    	*/
    	public Node[] getV(Node a){
    		 Node[] N = (Node[])v.toArray(new Node[0]);
    		 return N;
    	}//getV
    	
    	/**
    		verifica se due nodi sono uguali
    		@param o un oggetto
    		@return true se uguali
    	*/
    	public boolean equals(Object o){
                if (o instanceof Node){
                      Node p = (Node)o;
                      if (p.getX() == x && p.getY()==y) return true;
                }//if
                return false;
            }
    	
    	//vaiabili di classe
    	private double x;	//ascissa
    	private double y;	//coordinata
    	private int id;		//codice identificativo
    	private static int nextId = 1;	//codice identificativo successivo
    	private double r ;	//raggio d'azione
    	Vector v = new Vector();	//istanzia una lista di oggetti
    	
    }//Node
    Il problema consiste nel fatto che quando visualizzo l'output:

    codice:
    Area MAX: altezza=500; lunghezza=350
    
    id=1	 (191,88;38,32) 	 raggio=61,88 	 d = 0
    id=2	 (19,81;277,64) 	 raggio=78,64 	 d = 294,76
    id=3	 (268,16;211,26) 	 raggio=42,61 	 d = 189,02
    java.lang.NullPointerException
    	at NodeTest.main(NodeTest.java:68)
    il programma si comporta come se non uscisse dal primo for k, infatti mi NON mi visualizza il ciclo di debug. In particolar modo l'istruzione a riga 68 risulta essere la seguente: e.setId();
    Giuseppe SPECCHIO

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    56
    Sì ma non ci puoi fare gli indovinelli.

    Ci devi mettere tutto il codice e non [...].

    Da quello che si vede, al quarto ciclo di
    codice:
    for(k = 0; k < nodes.length; k++){
    		Node e = nodes[k];
    		e.setId();
    e è null.

    Dunque sembra che nodes[3] non sia inizializzato.
    Darei un'occhiata al codice che ci nascondi in cui si setta Np, che arresta il ciclo for in cui inizializzi nodes.

  3. #3
    Sinceramente non era mia intenzione fare gli indovinelli, ma anzi eliminare quella parte di codice, la quale a parer mio, non portava contributo ai fini della risoluzione del problema, comunque il listato integrale è il seguente:

    codice:
    public class NodeTest {
    
      public static void main(String argv[]) {
    	
    	//inerisce nell'array Nodes tre oggetti Node
    	Node[] nodes = new Node[150];
    	double d;	//distanza
    	double r; 	//raggio
    	int l = 350;	//Lunghezza Area
    	int a = 500;	//Altezza Area
    	double Nd;	//numeri di nodi generati da una sequqnza casuale
    	Integer i;	//buffer
    	int k,q;	//indice
    	boolean flag = true;
    	NumberFormat formattatore = NumberFormat.getNumberInstance();  // cultura predefinita
    	
    	formattatore.setMaximumFractionDigits(2); // max due cifre decimali dopo la virgola
    	
    	//metodo per leggere un numero corretto da input
            while (true){
                try {
                    String numero = JOptionPane.showInputDialog(null,"Inserisci un numero intero. [Con 20 genera casualmente]");
                    i = new Integer(numero);
                    break;
                } catch (NumberFormatException e) { 
                	JOptionPane.showMessageDialog(null,"Devi inserire un numero intero!");
                }//catch
            }//while
            
            System.out.println("\n Area MAX: altezza="+a+"; lunghezza="+l+"\n");
            
            //converte un numero oggetto Integer in un numero intero
            int Np = i.intValue();	//Numero di Nodi
            
    	if(Np==20){		//se il numero di nodi è 20 genera un numero di nodi casuali
              Nd=4+46*Math.random();
              Np=(int)Nd;	
            }//if
            
            if(Np>=150){
            	Np = 150;
            }//if
            
    	//System.out.println("***DEBUG Np = "+Np);
    	
    	//posiziona i nodi nel piano in modo casuale
    	for(k=0;k<Np;k++){
               nodes[k]= new Node(Math.random()*(a-30)+15, Math.random()*(l-30)+15);
             }//for k
             
    	
    	//stampa l'informazione su tutti gli oggetti Employee
    	for(k = 0; k < nodes.length; k++){
    		Node e = nodes[k];
    		e.setId();
    		r = e.getR();
    		//e.setR(-2);
    		//double r2 = e.getR();
    		d = e.getD(nodes[0].getX(), nodes[0].getY());
    		 // imposto il formattatore con le specifiche desiderate
    		System.out.println("id="+formattatore.format(e.getId())
    			+ "\t (" + formattatore.format(e.getX()) + ";" + formattatore.format(e.getY()) 
    			+ ") \t raggio=" + formattatore.format(r)
    			+ " \t d = " + formattatore.format(d));
    		nodes[k] = e;
    	}//for k
    
    //NON VIENE VISUALIZZATO!!!
    
    	for(k = 0; k < nodes.length; k++){
           		 // imposto il formattatore con le specifiche desiderate
           		System.out.println("***DEBUG nodes["+formattatore.format(nodes[k].getId())
           			+ "]\t (" + formattatore.format(nodes[k].getX()) + ";" + formattatore.format(nodes[k].getY()) 
           			+ ") \t raggio=" + formattatore.format(nodes[k].getR())
           			+ " \t d = " + formattatore.format( nodes[k].getD( nodes[0].getX(), nodes[0].getY() ) ) );
           	}//for k
    	
      }//main
      
    }//NodeTest
    Giuseppe SPECCHIO

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    56
    Il problema nel secondo (e nel terzo) ciclo for è che tenti di accedere a tutti i 150 oggetti di nodes[], mentre in realtà nel primo ciclo for hai inizializzato solo quelli con indice tra 0 e Np-1.
    Siccome Np è determinato a runtime, se Np è più piccolo di 150 ti becchi la NullPointerException quando tenti di accedere a setId() di nodes[Np].

    Dovresti modificare la condizione di uscita del secondo e del terzo ciclo for e renderla uguale a quella del primo.

    Comunque in Java non è conveniente costruirsi un array grande per poi usarne una parte secondo necessità a runtime: meglio usare le Collection (nel tuo caso, direi ArrayList).

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.