0

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

public void memPass(Memory[] memLocList) {

    memList = memLocList;

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

-编辑- 上面打印出 10 个值(整数),但如果我在另一种方法中尝试相同的方法,整数介于 0 和 10 之间,我会得到一个 NPE。

谁能告诉我如何从另一个方法访问这个数组的元素,该方法也接受另一个类的参数?

我正在尝试按照以下方式做一些事情:

public void accessArray(int mem) {

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

-编辑-对不起,我应该补充一点,这会产生 NullPointerException。

-新编辑-

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

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。

4

3 回答 3

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

对不起,如果我有任何语法错误。但是你明白了主要的想法。

于 2012-07-27T19:16:38.103 回答
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)
}
于 2012-07-27T19:17:27.287 回答
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());
       }
    }
}

这样就可以避免空指针异常。使用相同的概念,您也可以将其应用于您的方法,如下所示:

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的实例变量,并应用我上面提到的相同的空指针检查概念。

于 2012-07-27T19:28:58.487 回答