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

最初のメソッドが呼び出されると、配列の長さを表す整数がコンソールに出力されますが、2 番目のメソッドが呼び出されると、それは NPE であり、同じ配列ではないことが示唆されます。

2 番目のメソッドは、GUI 上のボタンをクリックすることによって呼び出されます。このボタンに関連付けられたメソッドには、次の行に沿った呼び出しのみがあります。

PLoop.accessArray();

私が間違っていることは誰にもわかりますか?

-編集- これらのメソッドへの呼び出しは、それぞれが PLoop のインスタンスを宣言する 2 つの異なるクラスから来ます。

proc = new PLoop();
4

3 に答える 3

3

memPassあなたが呼び出したインスタンスは、後で呼び出しているインスタンスとは異なる可能性が非常に高いと思いますaccessArray

同じインスタンスを使用している場合は、まったく問題ありません。(特に、格納されるのは引数のmemListなので、他の場所の変更だけで、null でなくなった後に null になることはありません。)

于 2012-07-30T12:47:39.663 に答える
3

あなたが示したクラスのコードは問題ないように見えるので、NPEx を取得している場合は、メソッドが順不同で呼び出されているか、2 番目のメソッド呼び出しが最初の 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 に答える