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();