acceder a elementos de una matriz que se ha pasado como parámetro - Java

Tengo un método que toma una matriz como parámetro de otra clase:

public void memPass(Memory[] memLocList) {

    memList = memLocList;

            for (int i = 0; i < 10; i++) {
        System.out.println(memList[i].getSomething());
    }
}

-EDITAR- Lo anterior imprime 10 valores (enteros), pero si intento lo mismo en el otro método con un número entero entre 0 y 10, obtengo un NPE.

¿Alguien puede decirme cómo acceder a los elementos de esta matriz desde otro método, que también toma un parámetro de otra clase?

Estoy tratando de hacer algo en este sentido:

public void accessArray(int mem) {

           int someInt = memList[mem].getSomething();
}

-EDITAR- Lo siento, debo agregar que esto da una NullPointerException.

-NUEVA EDICION-

OK, ahora he editado el código para que todo lo que tengo en la clase sea:

public class PLoop {

// instance variable
public Memory[] memlist;

  // method 1 
  public void memPass(Memory[] memLocList) {

   memList = memLocList;
   System.out.println(memList.length);
  }

  // method 2
  public void accessArray(int mem) {

   System.out.println(memList.length);
  }
}

El primer método imprime un número entero que representa la longitud de "memList" y el segundo da un NPE.

preguntado el 27 de julio de 12 a las 20:07

Lo que tienes parece bastante razonable. ¿Qué tal un SSCCE? Es memPass() realmente llamado? que valor de memLocList ¿esta pasado? ¿Ha intentado usar un depurador para determinar qué ¿es nulo? -

¿Los métodos memPass() y accessArray() son de la misma clase? ¿MemList es una variable miembro de esa clase? En caso afirmativo a ambos, el código que ya ha escrito aquí funciona tal como está. -

Mirando sus etiquetas de pregunta nullpointerexception significa que en mem índice de memList hay null valor que está tratando de usar por getSomething(). O memList es nulo (esto no es lo mismo que memList en el método anterior) -

@nkr eso será AIOOBEno, NPE. -

Hola DGH, ambos métodos están en la misma clase. memList es una variable de instancia de esa clase. Parece que algo más va mal, supongo. -

3 Respuestas

Si te entiendo bien, ¿quieres poder almacenar memLocList y luego acceder a él más tarde? Si es así, no puedo ver qué no funcionaría crear una variable de instancia.

public class Test {
    public Memory[] memlist;

    public void memPass(Memory[] memLocList) {
        memList = memLocList;
    }

    public void accessArray(int mem) {
        int someInt = memList[mem].getSomething();
    }
}

Por supuesto, ya no trabajo lo suficiente en Java, por lo que podría no ser posible crear y asignar una variable de instancia como esa. Pero siempre puedes almacenar los elementos en otro contenedor.

public class Test {
    public List<Memory> memlist;

    public void memPass(Memory[] memLocList) {
        memlist = new ArrayList<Memory>(Arrays.asList(memLocList));
    }

    public void accessArray(int mem) {
        int someInt = memList.get(mem).getSomething();
    }
}

Lo siento si tengo algún error de sintaxis. Pero entiendes la idea principal.

Respondido 27 Jul 12, 20:07

De hecho, solo logré que esto funcionara moviendo ambos métodos a la misma clase que la matriz, en lugar de pasar la matriz como un parámetro. - Robert

If memList es una variable de instancia de esa clase y esta es la misma clase en ambas situaciones (ambos métodos), entonces esto es obviamente una null valor en algún índice de memList.

private static class Memory {
    private static int index = 0;

    public int getSomething() {
        return index++;
    }
}

private static class Test {
    public Memory[] memlist;

    public void memPass(Memory[] memLocList) {
        memlist = memLocList;
    }

    public void accessArray(int mem) {
        int someInt = memlist[mem].getSomething();
        System.out.println(someInt);
    }
}
public static void main(String args[]) {
    Test t = new Test();
    Memory[] memList = new Memory[4];
    memList[0] = new Memory();
    memList[1] = null;
    t.memPass(memList);
    t.accessArray(0);
    t.accessArray(0);
    t.accessArray(1); //NPE thrown because null value in array
    //or
    Test t2 = new Test();
    t2.accessArray(0); //NPE thrown because array is null (different instance)
}

Respondido 27 Jul 12, 20:07

En su implementación, ya está asumiendo que la matriz que se pasa al método tiene 10 elementos y que cada uno de estos elementos de la matriz tiene un valor, por lo tanto, en algún momento encuentra una NullPointerException. Esto es peligroso, especialmente cuando solo está procesando una matriz que se pasa como argumento al método. Para asegurarse de que solo está accediendo a los elementos que están disponibles en la matriz, debe verificar cuál es la longitud de la matriz. Además, debe asegurarse de que cada vez que llame a los métodos de un elemento en una matriz (o haga algo con él), verifique primero si realmente está allí. Para su bucle for, puede hacer algo como esto:

if (memList != null) {
    for (int i = 0; i < memList.length; i++) {
       if (memList[i] != null) {
         System.out.println(memList[i].getSomething());
       }
    }
}

De esa manera, está a salvo de las excepciones de puntero nulo. Usando el mismo concepto, también puede aplicarlo a su método de esta manera:

public void accessArray(int mem) {

   if (mem > -1 && memList != null && memList.length > mem && memList[mem] != null){
      int someInt = memList[mem].getSomething();
   }
}

Por supuesto, esto supone que el método con el bucle for y el método accessArray están en la misma clase (o clase padre-hijo) y memList es una variable de instancia.

Y para guardar los elementos de la matriz como una copia profunda de memLocList, puede usar lo que ha sugerido @GJK, que es Arrays.asList a una variable de instancia y aplique el mismo concepto de verificación de puntero nulo que mencioné anteriormente.

Respondido 27 Jul 12, 20:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.