Nuevo problema con una clase
Publicado por Laguna (8 intervenciones) el 15/04/2008 10:21:29
Hola, sigo con las prácticas en java con eclipse, y me ha surgido un nuevo problema. Tengo una clase llamada Vehicle donde hay una serie de campos, pues bueno, declaro un objeto de la clase vehicle pero cuando quiero asignarle un valor al campo, después de haber reservado la memoria, me da un error que dice nullpointerexception local variables unavailable, después d probarlo mucho llevo desde ayer atrancado y no sé por qué puede ser. Aquí os dejo el código... del cuál he omitido algunas partes
package services;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Image;
import java.util.*;
import applet.Simulation;
public class SimulationServices extends Applet {
private static final long serialVersionUID = 1L;
/**
* Vehicle es al clase que gestiona la funcionalidades de los vehiculos
* en la simulacion
*/
/*************************************************************************/
// Esta es la clase que da problemas
/*************************************************************************/
class Vehicle {
/**
* Coordenada x del vehiculo
*/
private double x;
/**
* Coordenada y del vehiculo
*/
private double y;
/**
* Carretera por las que circula el vehiculo:
* 0: carretera horizontal (X)
* 1,2,3: carreteras verticales (Y)
*/
private int road;
/**
* Desplazamiento de la coordenada x del vehiculo en el ultimo
* movimiento
*/
private double dx;
/**
* Desplazamiento de la coordenada y del vehiculo en el ultimo
* movimiento
*/
private double dy;
/**
* Etiqueta que identifica el vehiculo
*/
private String label;
/**
* Ancho del vehiculo
*/
private int wideV;
/**
* Largo del vehiculo
*
*/
private int longV;
/**
* Constructor de la clase Vehicle
* inicializa los componentes de Vehicle
*/
public Vehicle(double x, double y, int road, String label, int wideV,
int longV) {
this.x = x;
this.y = y;
this.road = road;
this.label = label;
this.wideV = wideV;
this.longV = longV;
}
}
/**
* Guarda la referencia a la instancia unica de la clase de simulacion
* SimulationServices para cumplir el patron de singleton
*/
private static SimulationServices instanceSimulation = null;
// creador sincronizado para protegerse de posibles problemas multi-hilo
// otra prueba para evitar instantiación múltiple
private synchronized static void createInstance() {
if (instanceSimulation == null) {
instanceSimulation = new SimulationServices();
}
}
/**
* Constructor de la clase SimulationServices
* inicializa los componentes de SimulationServices.
* Se hace privado para seguir el patron de singleton
*/
private SimulationServices() {
// se crea la matriz de vehiculos de la simulacion
for (int i = 0; i < 3; i++) {
// se calcula las posiciones eje x carreteras verticales
xPosRoadY[i] = 150 * (i + 1);
// se calcula la porciones correspondientes a los cruces de las
// carreteras verticales
xPosRightCrossRoadX[i] = xPosRoadY[i] + VEHICLE_LENGTH;
xPosLeftCrossRoadX[i] = xPosRoadY[i] - VEHICLE_LENGTH;
// en principio los cruces se marcan como libres
blockedCross[i] = 0;
}
// se calculan las posiciones de las carretas verticales
for (int i = 0; i < 3; i++) {
xPosLeftRoadY[i] = xPosRoadY[i] - VEHICLE_WIDTH;
xPosRightRoadY[i] = xPosRoadY[i] + VEHICLE_WIDTH;
}
}
/**
* Devuelve la instancia de la simulacion, esto es,
* la instancia de la clase SimulationServices unica existente.
* Si dicha instancia no existe la construye, si ya existe la devuelve.
* Este metodo asegura por tanto que solo va a haber una instancia de
* la simulacion, que por tanto, va aseguir el patron de singleton.
*
* @return instanceSimulation
* unica existente en la simulacion, si no existe la crea
*/
public static SimulationServices getInstaceSimulation() {
if (instanceSimulation == null) createInstance();
return instanceSimulation;
}
/**
* Busca el vehiculo identificado por la etiqueta de entrada y si no existe
* lo anade a la simulacion mediante el metodo addVehicle
*
* @param label
* identifica el vehiculo a buscar
* @return posicion que ocupa el vehiculo a buscar en la
* matriz de vehiculos de la simulacion
*/
public int findVehicle(String label) {
int i, aux=0;
for (i=0; i<nVehicules; i++){
if (vehicles[i].label == label)
aux = i;
}
if (aux == 0){
addVehicle(label);
return -1;
}
else
return aux;
}
/**
* Anade el vehiculo identificado por la etiqueta de entrada a la simulacion
* (matriz de vehiculos correspondiente)
*
* @param label
* identifica el vehiculo a anadir
* @return nVehicules
* numero de vehiculos existentes en la simulacion
* tras incorporar el vehiculo de entrada
*/
private int addVehicle(String label) {
// Tener en cuenta como se deben
// establecer los valores iniciales del objeto Vehicle:
// road = azar entre 0 (horizontal)y 1,2,3 (verticales)
// wideV,longV = ctes. correspondientes
// label = parametro label
// Si es la carretera horizontal:
// x = 480 + 210 * azar
// y = yPosRoadX
// Otro caso
// x = xPosRoadY[correspondiente a su carretera];
// y = 10 + 100 * azar;
//Vehicle n;
Random rand = new Random();
Vehicle vehicles_aux[];
int j;
//private Vehicle vehicles[];
//vehicles = new ThreadVehicle ("Vehicle" + i, i);
vehicles_aux = new Vehicle [nVehicules];
for (j=0; j<nVehicules; j++)
vehicles_aux[j] = vehicles[j];
vehicles = new Vehicle [nVehicules+1];
for (j=0; j<nVehicules; j++)
vehicles[j] = vehicles_aux[j];
/********************************************/
// Aquí me da el error
/********************************************/
vehicles[0].road = 1;
//vehicles = new Vehicle [nVehicules+1];
vehicles[nVehicules].road = rand.nextInt(4);
vehicles[nVehicules].wideV = VEHICLE_WIDTH;
vehicles[nVehicules].longV = VEHICLE_LENGTH;
vehicles[nVehicules].label = label;
if (vehicles[nVehicules].road == 0){
vehicles[nVehicules].x = 480 + 210 * vehicles[nVehicules].road;
vehicles[nVehicules].y = yPosRoadX;
}
else{
vehicles[nVehicules].x = xPosRoadY[vehicles[nVehicules].road];
vehicles[nVehicules].y = 10 + 100 * vehicles[nVehicules].road;
}
nVehicules = nVehicules + 1;
return nVehicules;
}
package services;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Image;
import java.util.*;
import applet.Simulation;
public class SimulationServices extends Applet {
private static final long serialVersionUID = 1L;
/**
* Vehicle es al clase que gestiona la funcionalidades de los vehiculos
* en la simulacion
*/
/*************************************************************************/
// Esta es la clase que da problemas
/*************************************************************************/
class Vehicle {
/**
* Coordenada x del vehiculo
*/
private double x;
/**
* Coordenada y del vehiculo
*/
private double y;
/**
* Carretera por las que circula el vehiculo:
* 0: carretera horizontal (X)
* 1,2,3: carreteras verticales (Y)
*/
private int road;
/**
* Desplazamiento de la coordenada x del vehiculo en el ultimo
* movimiento
*/
private double dx;
/**
* Desplazamiento de la coordenada y del vehiculo en el ultimo
* movimiento
*/
private double dy;
/**
* Etiqueta que identifica el vehiculo
*/
private String label;
/**
* Ancho del vehiculo
*/
private int wideV;
/**
* Largo del vehiculo
*
*/
private int longV;
/**
* Constructor de la clase Vehicle
* inicializa los componentes de Vehicle
*/
public Vehicle(double x, double y, int road, String label, int wideV,
int longV) {
this.x = x;
this.y = y;
this.road = road;
this.label = label;
this.wideV = wideV;
this.longV = longV;
}
}
/**
* Guarda la referencia a la instancia unica de la clase de simulacion
* SimulationServices para cumplir el patron de singleton
*/
private static SimulationServices instanceSimulation = null;
// creador sincronizado para protegerse de posibles problemas multi-hilo
// otra prueba para evitar instantiación múltiple
private synchronized static void createInstance() {
if (instanceSimulation == null) {
instanceSimulation = new SimulationServices();
}
}
/**
* Constructor de la clase SimulationServices
* inicializa los componentes de SimulationServices.
* Se hace privado para seguir el patron de singleton
*/
private SimulationServices() {
// se crea la matriz de vehiculos de la simulacion
for (int i = 0; i < 3; i++) {
// se calcula las posiciones eje x carreteras verticales
xPosRoadY[i] = 150 * (i + 1);
// se calcula la porciones correspondientes a los cruces de las
// carreteras verticales
xPosRightCrossRoadX[i] = xPosRoadY[i] + VEHICLE_LENGTH;
xPosLeftCrossRoadX[i] = xPosRoadY[i] - VEHICLE_LENGTH;
// en principio los cruces se marcan como libres
blockedCross[i] = 0;
}
// se calculan las posiciones de las carretas verticales
for (int i = 0; i < 3; i++) {
xPosLeftRoadY[i] = xPosRoadY[i] - VEHICLE_WIDTH;
xPosRightRoadY[i] = xPosRoadY[i] + VEHICLE_WIDTH;
}
}
/**
* Devuelve la instancia de la simulacion, esto es,
* la instancia de la clase SimulationServices unica existente.
* Si dicha instancia no existe la construye, si ya existe la devuelve.
* Este metodo asegura por tanto que solo va a haber una instancia de
* la simulacion, que por tanto, va aseguir el patron de singleton.
*
* @return instanceSimulation
* unica existente en la simulacion, si no existe la crea
*/
public static SimulationServices getInstaceSimulation() {
if (instanceSimulation == null) createInstance();
return instanceSimulation;
}
/**
* Busca el vehiculo identificado por la etiqueta de entrada y si no existe
* lo anade a la simulacion mediante el metodo addVehicle
*
* @param label
* identifica el vehiculo a buscar
* @return posicion que ocupa el vehiculo a buscar en la
* matriz de vehiculos de la simulacion
*/
public int findVehicle(String label) {
int i, aux=0;
for (i=0; i<nVehicules; i++){
if (vehicles[i].label == label)
aux = i;
}
if (aux == 0){
addVehicle(label);
return -1;
}
else
return aux;
}
/**
* Anade el vehiculo identificado por la etiqueta de entrada a la simulacion
* (matriz de vehiculos correspondiente)
*
* @param label
* identifica el vehiculo a anadir
* @return nVehicules
* numero de vehiculos existentes en la simulacion
* tras incorporar el vehiculo de entrada
*/
private int addVehicle(String label) {
// Tener en cuenta como se deben
// establecer los valores iniciales del objeto Vehicle:
// road = azar entre 0 (horizontal)y 1,2,3 (verticales)
// wideV,longV = ctes. correspondientes
// label = parametro label
// Si es la carretera horizontal:
// x = 480 + 210 * azar
// y = yPosRoadX
// Otro caso
// x = xPosRoadY[correspondiente a su carretera];
// y = 10 + 100 * azar;
//Vehicle n;
Random rand = new Random();
Vehicle vehicles_aux[];
int j;
//private Vehicle vehicles[];
//vehicles = new ThreadVehicle ("Vehicle" + i, i);
vehicles_aux = new Vehicle [nVehicules];
for (j=0; j<nVehicules; j++)
vehicles_aux[j] = vehicles[j];
vehicles = new Vehicle [nVehicules+1];
for (j=0; j<nVehicules; j++)
vehicles[j] = vehicles_aux[j];
/********************************************/
// Aquí me da el error
/********************************************/
vehicles[0].road = 1;
//vehicles = new Vehicle [nVehicules+1];
vehicles[nVehicules].road = rand.nextInt(4);
vehicles[nVehicules].wideV = VEHICLE_WIDTH;
vehicles[nVehicules].longV = VEHICLE_LENGTH;
vehicles[nVehicules].label = label;
if (vehicles[nVehicules].road == 0){
vehicles[nVehicules].x = 480 + 210 * vehicles[nVehicules].road;
vehicles[nVehicules].y = yPosRoadX;
}
else{
vehicles[nVehicules].x = xPosRoadY[vehicles[nVehicules].road];
vehicles[nVehicules].y = 10 + 100 * vehicles[nVehicules].road;
}
nVehicules = nVehicules + 1;
return nVehicules;
}
Valora esta pregunta


0