Ayuda con un programa sobre la gestión de una agencia de viajes

lauryn_guti17
03 de Enero del 2005
Hola a todos!!!

Soy novata en esto del lenguaje en java, y para la universidad necesito hacer una práctica sobre la gestión de una agencia de viajes.

Tengo algunos problemillas a la hora de realizar las aplicaciones que me piden, ya que me generan algunos errores que no entiendo.
Mi ejercicio consiste en realizar una serie de clases: 'Cliente' y 'Vuelo', y permitir realizar las siguientes operaciones:
- Alta, baja y modificación de vuelos
- Alta, baja y modificación de clientes
- Listar todos los vuelos y sus características
- Listar todos los clientes y sus características
...

Sé que es fácil pero tengo problemas que no consigo arreglar por mucho que los mire y no entiendo el porqué de éstos. Aquí van la declaración de mis clases:

/* Clase cliente*/
public class Client
{
private int dni;
private String nom;
private String cognoms;
private String categoria;

public Client (int dni, String nom, String cognoms, String categoria)
{
this.dni = dni;
this.nom = nom;
this.cognoms = cognoms;
this.categoria = categoria;
}

public int GetDni() {
return dni;
}

public int CambiarDni (int dni_mod) {
this.dni = dni_mod;
return this.dni;
}
public String GetNom () {
return nom;
}
public String CambiarNom (String nom_mod) {
this.nom = nom_mod;
return this.nom;
}
public String GetCognoms () {
return cognoms;
}
public String CambiarCognoms (String noms_mod)
{
this.cognoms = cognoms_mod;
return this.cognoms;
}

/*Clase Vuelo*/
Es exactamente igual, pero con las características de cada uno de los vuelos.

Hasta aquí ningún problema. Entonces tengo una clase 'Agencia.java', que me permite introducir clientes, vuelos, devolverme la lista de clientes que tengo.. etc.. aquí su implementación:

/*Clase agencia.java*/
publlic class agencia
{
Client[] Clients;
private String nom;
int num_clients, num_vols;
private final int MAX_CLIENTS = 1000, MAX_VOLS = 1000;
private Vol[] Vols;

/** Constructor d'un nou client */
public agencia (String nom)
{
this.nom = nom;
this.Clients = new Client[MAX_CLIENTS];
this.Vols = new Vol[MAX_VOLS];
this.num_clients = 0;
this.num_vols = 0;
}

public int afegirClient (Client nou_client)
{
if (num_clients <= MAX_CLIENTS)
{
Clients [num_clients] = nou_client;
num_clients++;
}
return num_clients;
}

public int afegirVol (Vol nou_vol)
{
if (num_vols <= MAX_VOLS)
{
Vols [num_vols] = nou_vol;
num_vols++;
}
return num_vols;
}

public Client[] getClients()
{
return Clients;
}

public Vol[] getVols ()
{
return Vols;
}

public Client BuscarClient (Client nom)
{
for (int i=0;i<=num_clients;i++) {
if (Clients[i].GetNom().equals(nom))
return Clients[i];
}
return null;
}

public Vol BuscarVol (String codi)
{
for (int i=0; i<=num_vols; i++){
if (Vols[i].GetCodi().equals(codi))
return Vols[i];
}
return null;
}

public Client BuscarClientDni (int dni)
{
for (int i=0;i<=num_clients;i++) {
int d = Clients[i].GetDni();
if (d == dni)
return Clients[i];
}
return null;
}

public Vol BuscarVolOrigen (String origen)
{
for (int i=0; i<=num_vols; i++)
{
if (Vols[i].GetOrigen().equals(origen))
return Vols[i];
}
return null;
}
}

Bueno, hasta aquí también de momento todo bien, o al menos parece que en mi programa funciona, el problema viene cuando yo introduzco un nuevo cliente...
Porque yo entro en un bucle donde me da a escoger la opción que quiero realizar, una vez escojo la opción de dar de alta a un cliente, éste aparentemente me pide los datos y los guarda correctamente, pero al volver al menú y escoger la opción de 'Listar los clientes', me da un error del tipo: java.lang.NullPointerException

Aquí pongo el código del programa principal:
public class Menu_practica
{

public static void main(String[] args) throws Exception
{
int i,j, num_vol = 0, num_client = 0;
boolean sort = false;
final int MAX_CLIENTS = 1000;
Client [] Clients = new Client [MAX_CLIENTS];
DataInputStream in = new DataInputStream(System.in);
agencia ag = new agencia ("Viatges");
Data d = new Data();
System.out.println("MENU");
while (sort == false)
{
System.out.println("Quina opcio vol realitzar?");
System.out.println("1.- Altes, baixes i modificacions de clients");
System.out.println("2.- Llistat de clients amb les seves caracteristiques");
System.out.println("Introdueixi una opció: ");
String opcio = in.readLine();

char opcion = opcio.charAt(0);
switch (opcion)
case '1':

System.out.println ("a) Introdueixi el DNI o PASSAPORT del client => ");
String pass = in.readLine ();
int dni = Integer.parseInt (pass);
System.out.println ("b) Introdueixi el NOM => ");
String nom = in.readLine ();
System.out.println ("c)Introdueixi el COGNOM =>");
String cognoms = in.readLine ();
String categoria = "Turista";
Client nou_client = new Client (dni, nom, cognoms, categoria);
num_client = ag.afegirClient (nou_client);
break;

case '2' :
Clients = ag.getClients ();
for (i=0;i < num_client+1;i++) {
System.out.println ("DNI:" + Clients[i].GetDni());
System.out.println ("Nom:" + Clients[i].GetNom());
System.out.println ("Cognoms:" + Clients[i].GetCognoms());
}
break;

En este último código es donde me da la excepción que he comentado anteriormente, y los resultados que me da son:
DNI : 0;
Nom:null;
Cognom:null;

Si alguien ve algun fallo (que seguro que hay algunos) y puede ayudarme se lo agradecería, ya que necesito entregar este ejercicio en dos semanas y estoy un poco perdida.

Gracias de antemano
Un saludo a todos y FELIZ AÑO NUEVO

asdf
03 de Enero del 2005
Un error que he visto así a la ligera...

en el case '2'

la linea
for (i=0;i < num_client+1;i++) {

debe ser
for (i=0;i < num_client;i++) {

(sin sumarle uno)

Actualmente te debe dar error cuando intenta
listar el último cliente, pq no existe.

Saludos

lauryn_guti17
03 de Enero del 2005
Ya lo he probado!!Muchas gracias... lo había puesto inicialmente, pero había puesto el signo (<=) y poniendo simplemente < ya queda solucionado.

Ahora tengo unas dudillas más...sé que puedo llegar a ser un pokito pesada, pero es que tengo bastantes dudas.. y para no cansaros, lo que hago es ponerlas poco a poco.. jeje
En la práctica me indica que el código tiene que estar guardado por 'serialización', pero no sé realmente como se realiza.. me podrían ayudar??

Muchísimas gracias por responder.. te lo agradezco mucho!!