Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Nuevo en java - Problema con clases (creo)

Hola, buscando por mi problema encontre este foro, y ojala alguien me pueda ayudar.

Hice 2 clases proveedores (persona y bus) y una consumidora (main). Persona crea objetos de tipo persona con dos atributo: String nombre y boolean descuento.
Bus crea objetos de tipo bus con dos atributos: un int valorPasaje y un arrreglo de objetos Persona.

En el main simulo la venta de pasajes para el bus. El problema es que cuando main pide a la clase bus, "setear" o "getear" un dato a cualquiera de los objetos cliente del arreglo que se formo en la clase bus, manda error en esa linea en cuestion. El error es:

Exception in thread "main" java.lang.NullPointerException
at bus.Bus.agregarPasajero(Bus.java:35)
at bus.BusMain.main(BusMain.java:45)
Java Result: 1

Los codigos de la tres clases son:

Persona:
package bus;

public class Persona {

private String nombre;
private boolean descuento;

public Persona(String nombre, boolean descuento)
{
this.nombre = nombre;
this.descuento = descuento;
}

public Persona()
{
this.nombre = "";
this.descuento = false;
}

public String getNombre()
{
return nombre;
}

public void setNombre(String nombre)
{
this.nombre=nombre;
}

public boolean getDescuento()
{
return descuento;
}

public void setDescuento(boolean descuento)
{
this.descuento=descuento;
}
}

BUS:
package bus;

public class Bus {

private int valorPasaje;
private Persona[] clientes;

public Bus() {
valorPasaje=0;
clientes = new Persona[40];
}

public int getValorPasaje()
{
return valorPasaje;
}

public void setValorPasaje(int valorPasaje)
{
this.valorPasaje=valorPasaje;
}

public boolean agregarPasajero(String nombre, int asiento, boolean descuento)
{
if(clientes[asiento-1]==null)
{
clientes[asiento-1].setNombre(nombre); //se produce el error (set o get)
clientes[asiento-1].setDescuento(descuento);
return true;
}
else return false;
}

public int verGanancia()
{
int suma = 0;
for(int i=0; i<40; i++)
{
if(clientes[i]==null && clientes[i].getDescuento())
suma+=valorPasaje*0.9;
else suma+=valorPasaje;
}
return suma;
}
}

MAIN:


package bus;
import java.util.*;
import java.io.BufferedReader;

public class BusMain {

public static void main(String[] args) {
int n=0;
Bus bus1=new Bus();
do
{

System.out.println("Menu");
System.out.println("Ingrese opción:");
System.out.println("1.Establecer valor del pasaje.");
System.out.println("2.Agregar pasajero.");
System.out.println("3.Ver ganancia.");
System.out.println("4.Salir.");
n = (new Scanner(System.in).nextInt());

switch(n)
{
case 1:
System.out.println("Ingrese valor del pasaje.");
bus1.setValorPasaje(new Scanner(System.in).nextInt());
break;
case 2:
System.out.println("Ingrese nombre del pasajero.");
String nombre= (new Scanner(System.in).nextLine());
System.out.println("Ingrese numero de asiento.");
int asiento = (new Scanner(System.in).nextInt());
System.out.println("Ingrese si tiene descuento (s/n)");
boolean descuento =(new Scanner(System.in).nextLine()).equals("s");
if(bus1.agregarPasajero(nombre, asiento, descuento))
System.out.println("Pasajero ingresado");
else System.out.println("Asiento ocupado");
break;
case 3:
System.out.println("La ganancia hasta el momento es de: " + bus1.verGanancia());
break;
}
}while(n!=4);
}
}

Cualquier orrientacion que me puedan dan es apreciada, gracias.

octubre 5, 2013 | Registered Commenterpariquel

Si estableces if(clientes[asiento-1]==null)
es normal que te lance esa excepción, porque con seguridad esa entrada del array es null

octubre 6, 2013 | Registered Commenterchoces

Es que el error no lo envia ahi, sino en la linea siguiente, cuando le hago el set a un elemento del arreglo de personas.

octubre 6, 2013 | Registered Commenterpariquel

Fácil.
El problema es que el objeto Persona al que hace referencia esta entrada todavía no existe
clientes[asiento-1]
Deberías hacer algo como :
clientes[asiento-1] = new Persona();
clientes[asiento-1].setNombre(nombre);

octubre 6, 2013 | Unregistered Commenterfred

Claro que no lo lanza en esa línea, sino a causa de esa línea.

if(clientes[asiento-1]==null)
{
// aquí clientes[asiento-1] es null
clientes[asiento-1].setNombre(nombre); // se produce el error porque quieres acceder a métodos de un objeto que no existe como tal
clientes[asiento-1].setDescuento(descuento);
return true;
}

octubre 6, 2013 | Registered Commenterchoces