0

Estoy practicando estructura de datos, cree una clase llamada lista con la siguiente estructura:


public class Lista {
    Persona[] datos = new Persona[10];
    public boolean isEmpy(){
        for(int i = 0; i < this.datos.length; i++){
            if(this.datos[i] != null){
                return false;
            }
        }
        return true;
    }

    public int size(){
        int size = 0;
        for (Persona dato : datos) {
            if (dato != null) size++;
        }
        return size;
    }

    public boolean isFull(){
        return this.datos.length == size();
    }

    public void print(){
        if(isEmpy()) System.out.println("La lista esta vacia");
        else
            for (Persona dato : datos) {
                if (this.datos != null) System.out.println("[" + dato + "]");
                else System.out.println("[  ]");
            }
    }

    public void insert(int i, Persona obj){
        if(isEmpy()) this.datos[0] = obj;
        else if(isFull()) System.out.println("La lista esta llena");
        else if(i > this.datos.length) System.out.println("No se puede insertar");
        else{
            if(i > size())i = size() +1;
            for (int j = size(); j > i ; j--) {
                this.datos[j] = this.datos[j - 1];
            }
            this.datos[i] = obj;
        }
    }

    public void delete(int i){
        if(i > size() || i < 0) System.out.println("Posición inválida");
        else if(isEmpy()) System.out.println("No existe el elemento");
        else{
            for (int j = i; j < size(); j++) {
                this.datos[j] = this.datos[j + 1];
            }
            this.datos[size()] = null;
        }
    }

    public Persona get(int i){
        if(isEmpy() || i > size() || Math.abs(i) > size()) return null;
        if(i < 0) i = (size() - (i + 1)) -1;
        return this.datos[i];
    }

    public int indexOf(Persona obj){
        for(int i = 0; i < size(); i++){
            if(this.datos[i].equals(obj)) return i;
        }
        return -1;
    }

    public void sort(){
        Persona temp;
        for(int i = 1; i < size(); i++){
            for(int j = 0; j < (size() - 1); j++){
                if(this.datos[j].compareTo(this.datos[j + 1]) > 0){
                    temp = datos[j];
                    datos[j] = datos[j + 1];
                    datos[j + 1] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        Lista myList = new Lista();
        System.out.println(myList.isEmpy());
        myList.insert(1, new Persona("Sebastian", 21, 'M'));
        myList.print();
        System.out.println("-----------------------------");
        myList.insert(2, new Persona("Hector", 22, 'M'));
        myList.print();
        System.out.println("-----------------------------");
        myList.delete(8);
        System.out.println("-----------------------------");
        System.out.println(myList.get(-2));
        System.out.println("-----------------------------");
        myList.insert(3, new Persona("Karina", 22, 'F'));
        myList.insert(4, new Persona("Adrian", 19, 'M'));
        myList.insert(5, new Persona("Diego", 32, 'M'));
        myList.insert(7, new Persona("Ross", 15, 'F'));
        myList.insert(4, new Persona("Karina", 10, 'F'));
        System.out.println("-----------------------------");
        myList.print();
        System.out.println("-----------------------------");
        myList.sort();
        myList.print();
    }
}

Donde creo objetos de la clase Persona para llenar un array con objetos de la clase Persona, aquí el código:

class Persona{
    String nombre;
    int edad;
    char genero;

    Persona(String nombre, int edad, char genero){
        this.nombre = nombre;
        this.edad = edad;
        this.genero = genero;
    }

    @Override
    public String toString() {
        return "Persona{" +
                "nombre='" + nombre + '\'' +
                ", edad=" + edad +
                ", genero=" + genero +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Persona persona)) return false;
        return edad == persona.edad &&
                genero == persona.genero &&
                Objects.equals(nombre, persona.nombre);
    }

    public int compareTo(Object o){
        Persona p;
        if(o instanceof Persona) p = (Persona) o;
        else return -2;

        if(this.equals(p)) return 0;
        else{
            if(this.nombre.compareTo(p.nombre) == 0){
                if(this.edad == p.edad) return 0;
                else if(this.edad > p.edad) return 1;
                else return -1;
            }
        }
        return this.nombre.compareTo(p.nombre);
    }
} 

Lo que tengo problemas es el método compareTo(); En el debbug realiza la comparación del objeto con null y me lanza la Exceptionaparece este error:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Persona.compareTo(Object)" because "this.datos[j]" is null

¿Porqué tengo ese error?, ¿Cómo podría solucionarlo?

  • ¿Responde esto a tu pregunta? [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados). Absolutamente todos los NullPointerException son causados por un único motivo, y de hecho, si buscas ese error sea en google o sea aquí, encuentras cientos de respuestas y todas son igualmente válidas, puesto que **SIEMPRE** se soluciona de la misma manera... **No puedes usar métodos de un objeto que no ha sido instanciado (es `null`)** – Benito-B May 22 '22 at 07:34
  • En este caso, cuando haces `this.datos[j]` estás obteniendo un `null` y `null` no tiene método `compareTo()`. Lo que necesitas hacer es comprobar que los objetos no sean null antes de usarlos, es uno de los principios básicos de la programación. – Benito-B May 22 '22 at 07:38

0 Answers0