Si estableces if(clientes[asiento-1]==null)
es normal que te lance esa excepción, porque con seguridad esa entrada del array es null
choces
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.
pariquel
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);
fred
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;
}
choces
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.