Hola. Soy nuevo en Java, y realizando un ejercicio en el que debo manejar arrays me ha salido un error de nullPointerException, pero no comprendo por qué.
El error concreto es el siguiente:
Exception in thread "main" java.lang.NullPointerException
at trafico.Persona.compraCoche(Persona.java:22)
at trafico.PruebaClasesP2.main(PruebaClasesP2.java:11 )
El código del programa es:
PruebaClasesP2
Código Java:
Ver originalpackage trafico;
public class PruebaClasesP2 {
public static void main
(String[] args
) { Persona inazio = new Persona("Inazio","Claver","00000000A");
Coche[] coches;
coches = new Coche[10];
coches[0] = new Coche("0789A",90,7.5,220);
inazio.compraCoche(coches[0]);
inazio.usaCoche(65, 120);
coches[0].repostar(50);
coches[0].arrancarMotor();
inazio.usaCoche(65, 120);
}
}
Persona
Código Java:
Ver originalpackage trafico;
public class Persona {
// Propiedades
private Coche[] coche;
private int numCochesActual = 0; // Máximo 10
private int cocheEnUso;
// Constructor
nombre = nom;
apellido = apellidos;
this.dni = dni;
}
public void compraCoche(Coche c){
if (numCochesActual < 10){
coche[numCochesActual] = c;
c.setPropietario(this);
numCochesActual++;
}
else{
System.
out.
println("Ya tienes diez coches. No puedes comprar más"); }
}
public boolean poseeCoche(){
if (numCochesActual == 0)
return false;
else
return true;
}
public void eligeCocheEnUso(int num){
if (num < 0 || num > numCochesActual){
cocheEnUso = num-1; // Número de coche - 1 para posición en tabla
}
else{
System.
out.
println(nombre
+" "+apellido
+" no tiene esa cantidad de coches"); }
}
public void usaCoche(double distancia, double velocidad){
if (poseeCoche() == false)
System.
out.
println(nombre
+" "+apellido
+" no tiene coche en propiedad"); else{
if (numCochesActual == 1){
coche[0].arrancarMotor();
coche[0].fijarVelocidad(velocidad);
coche[0].recorrerDistancia(distancia);
}
else{
coche[cocheEnUso].arrancarMotor();
coche[cocheEnUso].fijarVelocidad(velocidad);
coche[cocheEnUso].recorrerDistancia(distancia);
}
}
}
public Coche[] getCoche() {
return coche;
}
public void imprimirDatosPersonales(){
int i;
System.
out.
println("Nombre: "+nombre
); System.
out.
println("Apellido: "+apellido
); System.
out.
println("DNI: "+dni
);
if (numCochesActual == 0)
System.
out.
println("No tiene coche actualmente"); else
for (i=0;i<10;i++)
System.
out.
println("Coche: "+coche
[i
].
getMatricula()); }
}
Coche
Código Java:
Ver originalpackage trafico;
public class Coche {
// Propiedades independientes del estado
private double maxLitrosDeposito;
private double maxLitrosReserva;
private double velocidadMaxima; // Mayor o igual a 0, en km/h
private double consumoMedio100km; // Litros consumidos a 100km/h durante 100km
private Persona propietario;
// Propiedades que definen el estado del coche
private boolean motorArrancado;
private boolean estaEnReserva;
private double numLitrosActual;
private double velocidadActual; // Mayor o igual a 0, en km/h
private double kilometraje;
// Constructor
public Coche
(String mat,
double maxLitrosDeposito,
double consumoMedio,
double velocidadMax
){ matricula = mat;
// Deposito
if (maxLitrosDeposito > 0)
this.maxLitrosDeposito = maxLitrosDeposito;
else
this.maxLitrosDeposito = 50;
// Consumo medio
if (consumoMedio > 0)
consumoMedio100km = consumoMedio;
else
consumoMedio100km = 7.5;
// Velicidad máxima
if (velocidadMax > 0)
velocidadMaxima = velocidadMax;
else
velocidadMaxima = 180;
// Reserva de depósito
maxLitrosReserva = (maxLitrosDeposito / 100)*15;
}
// Getters y setters
public void setMatricula
(String matricula
) { this.matricula = matricula;
}
public String getMatricula
() { return matricula;
}
public double getMaxLitrosDeposito() {
return maxLitrosDeposito;
}
public double getMaxLitrosReserva() {
return maxLitrosReserva;
}
public double getVelocidadMaxima() {
return velocidadMaxima;
}
public double getConsumoMedio100km() {
return consumoMedio100km;
}
public boolean isMotorArrancado() {
return motorArrancado;
}
public boolean isEstaEnReserva() {
return estaEnReserva;
}
public double getNumLitrosActual() {
return numLitrosActual;
}
public double getVelocidadActual() {
return velocidadActual;
}
public double getKilometraje() {
return kilometraje;
}
public Persona getPropietario(){
return propietario;
}
public void setPropietario(Persona p){
propietario = p;
}
// Métodos
public void arrancarMotor(){
if (motorArrancado == true){
System.
out.
println("El coche con matricula "+matricula
+" ya tenía el motor arrancado"); }
else{
if (numLitrosActual > 0){
if (estaEnReserva == true){
motorArrancado = true;
System.
out.
println("El coche con matricula "+matricula
+" está en reserva, pero arranca"); }
else{
motorArrancado = true;
System.
out.
println("El coche con matricula "+matricula
+" ha arrancado"); }
}
else{
System.
out.
println("El coche con matricula "+matricula
+" no tiene gasolina para arrancar"); }
}
}
public void pararMotor(){
if (motorArrancado == true){
motorArrancado = false;
System.
out.
println("El coche con matricula "+matricula
+" ha parado su motor"); }
}
public void repostar(double litros){
if (litros > 0){
if (numLitrosActual + litros > maxLitrosDeposito){
System.
out.
println("El coche con matricula "+matricula
+" desbordaría su depósito"); }
else{
numLitrosActual = numLitrosActual + litros;
if (numLitrosActual <= maxLitrosReserva)
estaEnReserva = true;
else
estaEnReserva = false;
System.
out.
println("El coche con matricula "+matricula
+" ha repostado correctamente"); }
}
System.
out.
println("El coche con matricula "+matricula
+" tiene "+numLitrosActual
+" litros de combustible"); }
public void fijarVelocidad(double velocidad){
if (motorArrancado == true){
if (velocidad > velocidadMaxima)
velocidadActual = velocidadMaxima;
else if (velocidad < 0)
velocidadActual = 0;
else
velocidadActual = velocidad;
}
else{
System.
out.
println("El coche con matricula "+matricula
+" tiene el motor apagado"); }
System.
out.
println("El coche con matricula "+matricula
+" tiene una velocidad de "+velocidadActual
+" km/h"); }
public void recorrerDistancia(double kilometros){
double consumoInstantaneo;
double litrosNecesarios;
double distanciaReal;
if (motorArrancado == false || velocidadActual == 0){
System.
out.
println("El coche con matricula "+matricula
+" tiene el motor apagado. No recorrerá esa distancia"); }
else{
if (kilometros <= 0)
System.
out.
println("Los kilómetros introducidos son negativos o 0. Imposible correr esa distancia"); else{
consumoInstantaneo = consumoMedio100km * (1+(velocidadActual - 100)/100);
litrosNecesarios = kilometros * consumoInstantaneo / 100;
if (litrosNecesarios < numLitrosActual){
numLitrosActual = numLitrosActual - litrosNecesarios;
kilometraje = kilometraje + kilometros;
System.
out.
println("El coche con matricula "+matricula
+" ha recorrido "+kilometros
+" kilómetros");
if (numLitrosActual <= maxLitrosReserva){
estaEnReserva = true;
System.
out.
println("El coche con matricula "+matricula
+" ha entrado en reserva"); }
}
else{
distanciaReal = 100 * numLitrosActual / consumoInstantaneo;
kilometraje = kilometraje + distanciaReal;
numLitrosActual = 0;
System.
out.
println("El coche con matrícula "+matricula
+" ha recorrido "+distanciaReal
+" kilómetros"); System.
out.
println("El coche con matrícula "+matricula
+" está sin gasolina"); System.
out.
println("El coche con matrícula "+matricula
+" está parado"); }
}
}
}
public boolean poseePropieatario(){
if (propietario == null)
return false;
else
return true;
}
}
El problema está en la función compraCoche de la clase Persona, pero no comprendo cual es