Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/03/2015, 17:32
inazense
Invitado
 
Mensajes: n/a
Puntos:
Pregunta Error con arrays en Java

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 original
  1. package trafico;
  2.  
  3. public class PruebaClasesP2 {
  4.  
  5.     public static void main(String[] args) {
  6.         Persona inazio = new Persona("Inazio","Claver","00000000A");
  7.         Coche[] coches;
  8.         coches = new Coche[10];
  9.         coches[0] = new Coche("0789A",90,7.5,220);
  10.        
  11.         inazio.compraCoche(coches[0]);
  12.         inazio.usaCoche(65, 120);
  13.         coches[0].repostar(50);
  14.         coches[0].arrancarMotor();
  15.         inazio.usaCoche(65, 120);
  16.        
  17.  
  18.     }
  19.  
  20. }

Persona
Código Java:
Ver original
  1. package trafico;
  2.  
  3. public class Persona {
  4.     // Propiedades
  5.     private String nombre;
  6.     private String apellido;
  7.     private String dni;
  8.     private Coche[] coche;
  9.     private int numCochesActual = 0; // Máximo 10
  10.     private int cocheEnUso;
  11.    
  12.    
  13.     // Constructor
  14.     public Persona(String nom, String apellidos, String dni){
  15.         nombre = nom;
  16.         apellido = apellidos;
  17.         this.dni = dni;
  18.     }
  19.    
  20.     public void compraCoche(Coche c){
  21.         if (numCochesActual < 10){
  22.             coche[numCochesActual] = c;
  23.             c.setPropietario(this);
  24.             numCochesActual++;
  25.         }
  26.         else{
  27.             System.out.println("Ya tienes diez coches. No puedes comprar más");
  28.         }
  29.     }
  30.    
  31.     public boolean poseeCoche(){
  32.         if (numCochesActual == 0)
  33.             return false;
  34.         else
  35.             return true;
  36.     }
  37.    
  38.     public void eligeCocheEnUso(int num){
  39.         if (num < 0 || num > numCochesActual){
  40.             cocheEnUso = num-1; // Número de coche - 1 para posición en tabla
  41.         }
  42.         else{
  43.             System.out.println(nombre+" "+apellido+" no tiene esa cantidad de coches");
  44.         }
  45.     }
  46.    
  47.     public void usaCoche(double distancia, double velocidad){
  48.         if (poseeCoche() == false)
  49.             System.out.println(nombre+" "+apellido+" no tiene coche en propiedad");
  50.         else{
  51.             if (numCochesActual == 1){
  52.                 coche[0].arrancarMotor();
  53.                 coche[0].fijarVelocidad(velocidad);
  54.                 coche[0].recorrerDistancia(distancia);
  55.             }
  56.             else{
  57.                 coche[cocheEnUso].arrancarMotor();
  58.                 coche[cocheEnUso].fijarVelocidad(velocidad);
  59.                 coche[cocheEnUso].recorrerDistancia(distancia);
  60.             }
  61.         }
  62.     }
  63.    
  64.     public Coche[] getCoche() {
  65.         return coche;
  66.     }
  67.  
  68.     public void imprimirDatosPersonales(){
  69.         int i;
  70.         System.out.println("Nombre: "+nombre);
  71.         System.out.println("Apellido: "+apellido);
  72.         System.out.println("DNI: "+dni);
  73.        
  74.         if (numCochesActual == 0)
  75.             System.out.println("No tiene coche actualmente");
  76.         else
  77.             for (i=0;i<10;i++)
  78.                 System.out.println("Coche: "+coche[i].getMatricula());
  79.     }
  80. }

Coche
Código Java:
Ver original
  1. package trafico;
  2.  
  3. public class Coche {
  4.     // Propiedades independientes del estado
  5.     private String matricula;
  6.     private double maxLitrosDeposito;
  7.     private double maxLitrosReserva;
  8.     private double velocidadMaxima; // Mayor o igual a 0, en km/h
  9.     private double consumoMedio100km; // Litros consumidos a 100km/h durante 100km
  10.     private Persona propietario;
  11.    
  12.     // Propiedades que definen el estado del coche
  13.     private boolean motorArrancado;
  14.     private boolean estaEnReserva;
  15.     private double numLitrosActual;
  16.     private double velocidadActual; // Mayor o igual a 0, en km/h
  17.     private double kilometraje;
  18.    
  19.     // Constructor
  20.     public Coche(String mat, double maxLitrosDeposito, double consumoMedio, double velocidadMax){
  21.         matricula = mat;
  22.        
  23.         // Deposito
  24.         if (maxLitrosDeposito > 0)
  25.             this.maxLitrosDeposito = maxLitrosDeposito;
  26.         else
  27.             this.maxLitrosDeposito = 50;
  28.        
  29.         // Consumo medio
  30.         if (consumoMedio > 0)
  31.             consumoMedio100km = consumoMedio;
  32.         else
  33.             consumoMedio100km = 7.5;
  34.        
  35.         // Velicidad máxima
  36.         if (velocidadMax > 0)
  37.             velocidadMaxima = velocidadMax;
  38.         else
  39.             velocidadMaxima = 180;
  40.        
  41.         // Reserva de depósito
  42.         maxLitrosReserva = (maxLitrosDeposito / 100)*15;
  43.     }
  44.  
  45.     // Getters y setters
  46.     public void setMatricula(String matricula) {
  47.         this.matricula = matricula;
  48.     }
  49.    
  50.     public String getMatricula() {
  51.         return matricula;
  52.     }
  53.  
  54.     public double getMaxLitrosDeposito() {
  55.         return maxLitrosDeposito;
  56.     }
  57.  
  58.     public double getMaxLitrosReserva() {
  59.         return maxLitrosReserva;
  60.     }
  61.  
  62.     public double getVelocidadMaxima() {
  63.         return velocidadMaxima;
  64.     }
  65.  
  66.     public double getConsumoMedio100km() {
  67.         return consumoMedio100km;
  68.     }
  69.  
  70.     public boolean isMotorArrancado() {
  71.         return motorArrancado;
  72.     }
  73.  
  74.     public boolean isEstaEnReserva() {
  75.         return estaEnReserva;
  76.     }
  77.  
  78.     public double getNumLitrosActual() {
  79.         return numLitrosActual;
  80.     }
  81.  
  82.     public double getVelocidadActual() {
  83.         return velocidadActual;
  84.     }
  85.  
  86.     public double getKilometraje() {
  87.         return kilometraje;
  88.     }
  89.    
  90.     public Persona getPropietario(){
  91.         return propietario;
  92.     }
  93.    
  94.     public void setPropietario(Persona p){
  95.         propietario = p;
  96.     }
  97.    
  98.     // Métodos
  99.     public void arrancarMotor(){
  100.         if (motorArrancado == true){
  101.             System.out.println("El coche con matricula "+matricula+" ya tenía el motor arrancado");
  102.         }
  103.         else{
  104.             if (numLitrosActual > 0){
  105.                 if (estaEnReserva == true){
  106.                     motorArrancado = true;
  107.                     System.out.println("El coche con matricula "+matricula+" está en reserva, pero arranca");
  108.                 }
  109.                 else{
  110.                     motorArrancado = true;
  111.                     System.out.println("El coche con matricula "+matricula+" ha arrancado");
  112.                 }
  113.             }
  114.             else{
  115.                 System.out.println("El coche con matricula "+matricula+" no tiene gasolina para arrancar");
  116.             }
  117.         }
  118.     }
  119.    
  120.     public void pararMotor(){
  121.         if (motorArrancado == true){
  122.             motorArrancado = false;
  123.             System.out.println("El coche con matricula "+matricula+" ha parado su motor");
  124.         }
  125.     }
  126.    
  127.     public void repostar(double litros){
  128.         if (litros > 0){
  129.             if (numLitrosActual + litros > maxLitrosDeposito){
  130.                 System.out.println("El coche con matricula "+matricula+" desbordaría su depósito");
  131.             }
  132.             else{
  133.                 numLitrosActual = numLitrosActual + litros;
  134.                 if (numLitrosActual <= maxLitrosReserva)
  135.                     estaEnReserva = true;
  136.                 else
  137.                     estaEnReserva = false;
  138.                
  139.                 System.out.println("El coche con matricula "+matricula+" ha repostado correctamente");
  140.             }
  141.         }
  142.        
  143.         System.out.println("El coche con matricula "+matricula+" tiene "+numLitrosActual+" litros de combustible");
  144.     }
  145.    
  146.     public void fijarVelocidad(double velocidad){
  147.         if (motorArrancado == true){
  148.             if (velocidad > velocidadMaxima)
  149.                 velocidadActual = velocidadMaxima;
  150.             else if (velocidad < 0)
  151.                 velocidadActual = 0;
  152.             else
  153.                 velocidadActual = velocidad;
  154.         }
  155.         else{
  156.             System.out.println("El coche con matricula "+matricula+" tiene el motor apagado");
  157.         }
  158.        
  159.         System.out.println("El coche con matricula "+matricula+" tiene una velocidad de "+velocidadActual+" km/h");
  160.     }
  161.    
  162.     public void recorrerDistancia(double kilometros){
  163.        
  164.         double consumoInstantaneo;
  165.         double litrosNecesarios;
  166.         double distanciaReal;
  167.  
  168.         if (motorArrancado == false || velocidadActual == 0){
  169.             System.out.println("El coche con matricula "+matricula+" tiene el motor apagado. No recorrerá esa distancia");
  170.         }
  171.         else{
  172.             if (kilometros <= 0)
  173.                 System.out.println("Los kilómetros introducidos son negativos o 0. Imposible correr esa distancia");
  174.             else{
  175.                 consumoInstantaneo = consumoMedio100km * (1+(velocidadActual - 100)/100);
  176.                 litrosNecesarios = kilometros * consumoInstantaneo / 100;
  177.                
  178.                 if (litrosNecesarios < numLitrosActual){
  179.                     numLitrosActual = numLitrosActual - litrosNecesarios;
  180.                     kilometraje = kilometraje + kilometros;
  181.                    
  182.                     System.out.println("El coche con matricula "+matricula+" ha recorrido "+kilometros+" kilómetros");
  183.                    
  184.                     if (numLitrosActual <= maxLitrosReserva){
  185.                         estaEnReserva = true;
  186.                         System.out.println("El coche con matricula "+matricula+" ha entrado en reserva");
  187.                     }
  188.                 }
  189.                 else{
  190.                     distanciaReal = 100 * numLitrosActual / consumoInstantaneo;
  191.                     kilometraje = kilometraje + distanciaReal;
  192.                     numLitrosActual = 0;
  193.                     System.out.println("El coche con matrícula "+matricula+" ha recorrido "+distanciaReal+" kilómetros");
  194.                     System.out.println("El coche con matrícula "+matricula+" está sin gasolina");
  195.                     System.out.println("El coche con matrícula "+matricula+" está parado");
  196.                 }
  197.             }
  198.         }
  199.     }
  200.    
  201.     public boolean poseePropieatario(){
  202.         if (propietario == null)
  203.             return false;
  204.         else
  205.             return true;
  206.     }
  207. }

El problema está en la función compraCoche de la clase Persona, pero no comprendo cual es