0

os comento, tengo por un lado esta clase

static class Item implements Serializable {
    int Id;
    String nombre, descripcion;
    int tipo; //{1-armas, 2-armadura, 3-miscelánea}
    int experiencia;
} //fin clase Item

También tengo un método donde relleno un array con Pociones de esta clase, por ejemplo PocimaVida25... Tengo que mostrar este array, cuando pongo este código:

System.out.println("Tus ítems son los siguientes: ");
    for(int j = 0; j <= listaItems.length; j++) {
        System.out.println(j + 1 + ": " + listaItems[j].nombre);
    } 

me da aparece esto, es decir, me las muestra bien pero luego me dice que apunta a un sitio nulo, y no sé como solucionarlo:

  Tus ítems son los siguientes: 
1: Espadas de Kratos
2: Arco de Diana
3: Escudo de la Gorgona
Exception in thread "main" java.lang.NullPointerException

Mi otra duda es que en otro ejercicio tengo que hacer que se muestre alfabeticamente, y en este ya no sé como hacerlo, he leído por internet que se puede usar una instrucción que se llama sort, pero eso no nos lo han enseñado en clase así que no creo que pueda utilizarlo: De momento tengo esto, pero no sé como hacer para ir comparándolo, o sí siquiera voy yendo bien:

public static void MostarItemAlfabeticamente(Item [] listaItems, int MAXITEMS, Item golem, Item esqueleto, Item kratos, Item diana,Item sabiduria, Item gorgona ){
         for(int i = 0;i < listaItems.length;i++){
             char primeraLetra = listaItems[i].nombre.charAt(1);
         }

     }

Un saludo!

  • java amigo, no javascript; saludos –  Dec 15 '18 at 10:38
  • 2
    Posible duplicado de [¿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) –  Dec 15 '18 at 14:38

2 Answers2

0

Por el NullPointerException (NPE) fijate dentro del listaItems que debes tener algúna posición null. El array actúa como una cajonera para guardar items, pero si en un cajón te falta un item (es null), no podés llamar métodos sobre lo que no hay.

Dependiendo de como lo quieras manejar podés optar por no tener posiciones vacías (null) o, antes de llamar un método sobre un item, verificar que no sea null.

Respecto del ordenamiento, si te han enseñado algún método deberías hacerlo de esa forma.

Un algoritmo básico para hacer ordenamiento es el de la burbuja por si quieres googlearlo para ver como funciona.

Usando las apis de java podés ordenar un Array con Arrays.sort(). En este caso Item debe implementar Comparable<Item> y tienes que definir en Item el método compareTo(Item) para que devuelva -1, 0, o 1 dependiendo si el item comparado es menor, igual, o mayor al item pasado por parámetro.

Juan
  • 5,605
  • 1
  • 9
  • 15
0

El NullPointer te da porque como bien pones al iniciar j, el indice de colecciones/array en Java empieza por 0, por lo que su índice máximo es length -1. Deja la condición de salida un menor que (sin igual) y te funcionará. También quita el j+1 o el último elemento también se pasará de rango.

for(int j = 0; j < listaItems.length; j++) {
    System.out.println(j + ": " + listaItems[j].nombre);
} 

La clase java.util.Collections permite ordenar listas, incluso si contienen Clases puede proporcionarlo un java.util.Comparator en el que indicas cómo se debe de ordenar. Según tu ejemplo deberías crear un Comparator

static class ItemComparator implements Comparator<Item> {
    public int compare(final Item o1, final Item o2) {
        return (o1.nombre.compareTo(o2.nombre));
    }
}

Y en tu método pasar el Array que te llega a lista y llamas a Collction.sort pasándole el Comparator (en el ejemplo lo dejo con Lambdas si usas Java 8 para que veas como ahorrarte la Clase anterior)

public static void MostarItemAlfabeticamente(final Item[] listaItems) {
    final List<Item> items = Arrays.asList(listaItems);
    final Comparator<Item> comp = (o1, o2) -> (o1.nombre.compareTo(o2.nombre));
    Collections.sort(items, comp); // Aquí ya tienes la lista ordenada
    for (Item it: items) {
        // Mostrar datos item
    }
}

Por último te recomiendo que si vas a manipular colecciones uses Collection (List o Set, usando Set para no guardar duplicados) en vez de Arrays

Aldhor
  • 1