0

我有一个带有数组作为实例变量/字段的类,它从另一个类传递到这个类中的第一个方法。我的印象是,我也应该能够从另一个方法访问它,而无需将其传递给该方法,但是当我尝试时,我得到了一个 NPE。

这是代码:

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() {

        System.out.println(memList.length);
    }
}

当调用第一种方法时,我在控制台上打印一个整数,表示数组的长度,但是当调用第二种方法时,它是 NPE,表明不是同一个数组。

第二种方法是通过单击 GUI 上的按钮来调用的。与此按钮关联的方法仅具有如下调用:

PLoop.accessArray();

谁能告诉我我做错了什么?

-EDIT- 对这些方法的调用来自两个不同的类,每个类都声明了一个 PLoop 实例:

proc = new PLoop();
4

3 回答 3

3

我强烈怀疑您调用memPass的实例与您稍后调用的实例accessArray不同。

如果您使用相同的实例,那应该绝对没问题。(特别是要存储的是参数的,所以它不会memList在不为空后变为空,只是由于其他地方的变化。)

于 2012-07-30T12:47:39.663 回答
3

您显示的类中的代码看起来不错,因此如果您得到一个 NPEx,那么要么方法被不按顺序调用,要么第二个方法调用是在与第一个不同的 PLoop 实例上进行的。

要检查调用是否在同一个对象上进行,请尝试打印出this方法内部的值并检查值是否相同:

System.out.println(this);
于 2012-07-30T12:48:55.487 回答
1

您的 PLoop 类中的方法不是静态的 您仍在调用PLoop.accessArray();

你能告诉我真正的场景是什么吗?

就像@Jon Skeet 告诉的那样,代码似乎很好。唯一的可能是您可能不按顺序执行它们,或者在调用第一个方法后您可能会弄乱 memLocList 。

于 2012-07-30T12:57:21.647 回答