访问已作为参数传递的数组元素 - Java

时间:2012-07-27 19:08:42

标签: java arrays nullpointerexception parameter-passing

我有一个方法,它将数组作为另一个类的参数:

public void memPass(Memory[] memLocList) {

    memList = memLocList;

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

CNC中 上面打印出10个值(整数)但是如果我在另一个方法中尝试使用0和0之间的整数相同的值。 10我得到一份NPE。

有谁能告诉我如何从另一个方法访问这个数组的元素,这个方法还从另一个类中获取参数?

我正试图沿着这些方向做点什么:

public void accessArray(int mem) {

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

-EDIT-抱歉,我应该补充说这会产生NullPointerException。

-NEW编辑 -

好的,我现在已经编辑了代码,所以我在课堂上的所有内容都是:

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);
  }
}

第一种方法打印一个表示“memList”长度的整数,第二种方法给出一个NPE。

3 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望能够存储memLocList,然后再访问它吗?如果是这样,我看不出创建实例变量的行为是什么。

public class Test {
    public Memory[] memlist;

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

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

当然,我不再使用Java了,所以可能无法创建和分配像这样的实例变量。但是你总是可以将元素存储在另一个容器中。

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();
    }
}

很抱歉,如果我有任何语法错误。但是你得到了主要的想法。

答案 1 :(得分:1)

如果memList是该类的实例变量,并且在两种情况下都是相同的类(两种方法),那么在null的某个索引处这显然是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)
}

答案 2 :(得分:1)

在您的实现中,您已经假设传递给该方法的数组有10个元素,并且每个数组项都有一个值,因此,在某些时候您会遇到NullPointerException。这很危险,尤其是当您处理一个作为参数传递给该方法的数组时。要确保您只访问数组中可用的元素,您需要检查数组的长度。此外,您需要确保无论何时调用数组中元素的方法(或对其执行任何操作),请首先检查它是否实际存在。对于你的for循环,你可以这样做:

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

这样就可以避免nullpointer异常。使用相同的概念,您也可以将它应用于您的方法:

public void accessArray(int mem) {

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

当然这是假设带有for循环的方法和accessArray方法在同一个类(或父子类)中,而memList是一个实例变量。

为了将数组的元素保存为memLocList的深层副本,您可以使用@GJK建议的Arrays.asList实例变量,并应用上面提到的相同的nullpointer检查概念。