0

別のクラスのパラメーターとして配列を受け取るメソッドがあります。

public void memPass(Memory[] memLocList) {

    memList = memLocList;

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

-編集-上記は10個の値(整数)を出力しますが、0から10までの整数を使用して他の方法で同じことを試みると、NPEが得られます。

別のクラスからパラメータを受け取る別のメソッドからこの配列の要素にアクセスする方法を誰かに教えてもらえますか?

私はこれらの線に沿って何かをしようとしています:

public void accessArray(int mem) {

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

-編集-申し訳ありませんが、これによりNullPointerExceptionが発生することを追加する必要があります。

-新しい編集-

OK、これでコードを編集して、クラスにあるのは次のようになりました。

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」の長さを表す整数を出力し、2番目のメソッドはNPEを提供します。

4

3 に答える 3

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

構文エラーがある場合は申し訳ありません。しかし、あなたは主なアイデアを得る。

于 2012-07-27T19:16:38.103 に答える
1

memListがそのクラスのインスタンス変数であり、これが両方の状況 (両方のメソッド) で同じクラスである場合、これは明らかに のインデックスnullの値ですmemList

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)
}
于 2012-07-27T19:17:27.287 に答える
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());
       }
    }
}

そうすれば、nullpointer 例外から安全になります。同じ概念を使用して、次のようにメソッドに適用することもできます。

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したインスタンス変数を使用し、上記で説明した nullpointer チェックの同じ概念を適用できます。

于 2012-07-27T19:28:58.487 に答える