【问题标题】:array as instance variable passed as parameter数组作为实例变量作为参数传递
【发布时间】:2012-07-30 12:44:12
【问题描述】:

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

谁能从中看出我做错了什么?

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

proc = new PLoop();

【问题讨论】:

  • 你是在memPass之前打电话给accessArray吗? (或者在不同的物体上?)
  • 您已将其简化到代码不会显示问题的程度。只要您在同一个对象上调用这两种方法,这段代码就可以完美运行。如果你在不同的对象上调用它们,那么,那就是另一回事了。
  • memPass 先被调用,然后我点击GUI上的一个按钮调用accessArray。
  • 这个方法怎么会被静态调用??
  • 你确定是同一个对象吗?

标签: java arrays nullpointerexception parameter-passing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    要检查是否对同一个对象进行了调用,请尝试在您的方法中打印出this 的值并检查这些值是否相同:

    System.out.println(this);
    

    【讨论】:

    • 感谢您的提示 - 我确实得到了不同的值:PLoop@79024994 - 第一种方法和 PLoop@78cade31 第二种方法。
    【解决方案3】:

    PLoop 类中的方法不是静态的 还是你打电话给PLoop.accessArray();

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

    就像@Jon Skeet 所说的那样,代码似乎没问题。唯一的可能是你可能是 不按顺序执行它们,否则您可能会在第一次之后弄乱 memLocList 方法被调用。

    【讨论】:

    • 对不起,它实际上写成“proc = new PLoop;”在 gui 的主构造函数中,然后是“proc.accessArray();”在调用它的方法中。
    • 你是在调用method1之后才调用method2吗?
    • 是的。在方法 1 已打印到控制台后,通过单击 GUI 上的按钮调用方法 2。
    • 嘿罗伯特...问题已经解决了对吧?这是因为这 2 个对象是不同的……您在一个对象上设置 memList 并在不同对象上调用 accessArray。
    • 这似乎是问题所在,但我还没有找到它发生的原因。
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多