Seguramente el error está en este método, concretamente en la condición del bucle for
public void mostrarLista(){//muestro la lista completa
for (int i=0;i<=cantantes.size();i++){
System.out.println("Cantante "+i+" "+cantantes.get(i));
}
}
Al recorrer vectores, arrayList y similares... el indice del bucle nunca debe ser igual al tamaño del array.
Supongamos que tienes 4 cantantes en el arrayList
Si tienes 4, estos cantantes están numerados del 0 al 3, es decir:
0,1,2,3Entonces si al bucle le dices que el indice i aumente hasta que sea
menor o igual que cantantes.size():
for (int i=0;i<=cantantes.size();i++)
Puesto que cantantes.size() es igual a 4 (porque suponemos que tenemos 4 canantes)...le estas diciendo que empiece por la posicion 0 y vaya hasta la posicion 4.
Pero las posiciones en este caso son solo 0, 1 ,2 y 3...
Por eso, cuando intenta leer la posicion 4 del arraylist, como no existe, ocurre una excepcion de NullPointer.
Es decir, "Puntero Nulo", le has pedido que apunte a una posicion del arrayList que no existe (la posicion 4)
Para que el bucle for no se pase, tienes que decirle que la i ha de aumentar mientras sea
menor que cantantes.size()
for (int i=0;i<cantantes.size();i++)
DE este modo, recorrerá la posicion 0, 1,2,3... y cuando la i valga 4, el bucle finalizará y no intentará leer la posicion 4, la cuál no existe.
Prueba a hacer ese pequeño cambio y a ver si ahora sí te funciona