我有一个方法,它将数组作为另一个类的参数:
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。
答案 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检查概念。