访问作为参数传递的数组元素-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