2012-07-27 62 views
0

我有需要的阵列作为一个参数从另一个类的方法:访问元素 - 爪哇

public void memPass(Memory[] memLocList) { 

    memList = memLocList; 

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

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

任何人都可以告诉我如何从另一个方法访问此数组的元素,这也从另一个类获取参数?

我试图做的东西沿着这些路线:

public void accessArray(int mem) { 

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

CNC中对不起,我要补充一点,这给出了一个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。

+1

你有什么看起来足够合理。 [SSCCE](http://sscce.org)怎么样? memPass()实际上是否被调用? “memLocList”的值是什么?您是否尝试过使用调试器来确定_what_为空? – 2012-07-27 19:10:36

+0

是同一类的memPass()和accessArray()方法吗? memList是该类的成员变量吗?如果对两者都是,那么你已经写在这里的代码按原样运行。 – DGH 2012-07-27 19:10:53

+1

看看你的问题标签'nullpointerexception',这意味着在'memList'的'mem'索引处有'null'值,你正试图使用​​'getSomething()'。或者'memList'为空(这与前面方法中的'memList'不同) – Xeon 2012-07-27 19:11:58

回答

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

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

+0

我实际上只设法通过将这两个方法移动到与数组相同的类而不是将该数组作为参数传递来实现这个工作。 – Robert 2012-08-05 12:01:20

1

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