1

Java の配列に問題があります。クラスで配列をクラスフィールドとして使用していますが、クラスをインスタンス化していないため、これらはすべて静的です。私は次のように配列を呼び出します (ところで、これはオブジェクトの配列であり、'Customer' は独自のクラスです):

 public static Customer[] cDatabase = new Customer[MAX_DATABASE];

MAX_DATABASE は、エントリの最大数を表す定数です。しかし、次のように入力するとどうなりますか。

 className.cDatabase[0].firstName = "John";

(簡単にするためにメソッドの使用を避けています) その値は調整されますが、配列内の他のすべてのセルのすべての firstName フィールドも変更されます。これは、配列を呼び出した方法と関係があると確信していますが、これを行うと:

 for(int i = 0; i<className.MAX_DATABASE; i++){
      className.cDatabase[i] = new Customer();
 }

次のようにフィールドを宣言した後:

 public static Customer[] cDatabase;

しかし、その後、nullpointerexception が発生します。要素が配列の同じインデックスを指さないように、この配列を適切に機能させる最善の方法は何ですか? 正しい答えもNPEを回避すると確信しています...

4

3 に答える 3

4

両方を行う必要があります。新しい配列を作成し、その配列に新しいオブジェクトを配置します。

public static Customer[] cDatabase = new Customer[MAX_DATABASE];
for(int i = 0; i<className.MAX_DATABASE; i++){
      className.cDatabase[i] = new Customer();
}
于 2012-12-31T01:32:30.877 に答える
2

firstNameフィールド自体がクラスで宣言さstaticれていないことを確認してください。そうしないと、可能な値が 1 つしか保持されなくなります。Customer

class Customer {
  private String firstName;
  ...

}

また、パブリック フィールドを使用することは、一般的には良い設計ではありません。これらのフィールドにゲッターとセッターを使用することを検討してください。cDatabase配列フィールド自体にも同じことが当てはまります。

于 2012-12-31T01:27:12.370 に答える
2

すべてのセルですべてfirstNameが変化する場合、次の 2 つが考えられます。

  • クラスのように宣言firstNameし、静的な方法でアクセスする必要があることを示す警告を無視しましたstaticCustomer
  • 配列のすべての要素に同じ Customer インスタンスを割り当てています

例えば

Customer[] array = new Customer[MAX];
Customer c = new Customer();
for (int i = 0; i < MAX; ++i)
  array[i] = c;

ここでは、配列のすべての要素が同じポイントを指しているCustomerため、常にすべてのセルから同じものを変更して取得します。

あなたがすべきことは次のようなものです:

Customer[] array = new Customer[MAX];
for (int i = 0; i < MAX; ++i)
  array[i] = new Customer();

このようにして、MAXの個別のインスタンスを作成しますCustomer。1 つを変更しても、他には影響しません。

于 2012-12-31T01:36:01.033 に答える