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

访问作为参数传递的数组元素-Java,java,arrays,nullpointerexception,parameter-passing,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()); } } -编辑-抱歉,我应该补充一点,这会产生NullPointerException -新编辑- 好

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

public void memPass(Memory[] memLocList) {

    memList = memLocList;

            for (int i = 0; i < 10; i++) {
        System.out.println(memList[i].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

如果我理解的没错,您希望能够存储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();
    }
}
公共类测试{
公开名单;
public void memPass(内存[]memLocList){
memlist=newarraylist(Arrays.asList(memLocList));
}
公共void访问数组(int mem){
int-someInt=memList.get(mem.getSomething();
}
}

抱歉,如果我有任何语法错误。但是你明白了主要意思。

如果我没弄错的话,你想存储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();
    }
}
公共类测试{
公开名单;
public void memPass(内存[]memLocList){
memlist=newarraylist(Arrays.asList(memLocList));
}
公共void访问数组(int mem){
int-someInt=memList.get(mem.getSomething();
}
}

抱歉,如果我有任何语法错误。但是你明白了要点。

如果
memList
是该类的一个实例变量,并且在两种情况下(两种方法)都是同一个类,那么这显然是
memList
的某个索引处的
null

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

如果
memList
是该类的一个实例变量,并且在两种情况下(两种方法)都是同一个类,那么这显然是
memList
的某个索引处的
null

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

在您的实现中,您已经假设传递给该方法的数组有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
,对实例变量应用我上面提到的空指针检查的相同概念。

在您的实现中,您已经假设传递给该方法的数组有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
,对实例变量应用我上面提到的空指针检查的相同概念。

您得到的看起来足够合理。来一杯怎么样?
memPass()
是否实际被调用?传递的
memLocList
的值是多少?您是否尝试过使用调试器来确定什么是null?memPass()和accessArray()方法是否属于同一类?memList是该类的成员变量吗?如果两者都是肯定的,那么您已经在这里编写的代码将按原样工作。查看您的问题标签
nullpointerexception
,这意味着在
memList
index处有
null
值,您正试图通过
getSomething()
使用该值。或者
memList
为空(这与前面方法中的
memList
不同)@nkr将
AIOOBE
,而不是
NPE
。嗨,DGH,这两个方法在同一类中。memList是该类的一个实例变量。我想好像是出了什么问题。你的东西看起来很合理。来一杯怎么样?
memPass()
是否实际被调用?传递的
memLocList
的值是多少?您是否尝试过使用调试器来确定什么是null?memPass()和accessArray()方法是否属于同一类?memList是该类的成员变量吗?如果两者都是肯定的,那么您已经在这里编写的代码将按原样工作。查看您的问题标签
nullpointerexception
,这意味着在
memList
index处有
null
值,您正试图通过
getSomething()
使用该值。或
memList
为空(thi