2

あるクラスから次のクラスに配列のデータを渡すのに問題があります。

編集 すると、エラーが発生しなくなり、コードがコンパイルされますが、警告されたように、配列のすべての要素に対して null を取得しました。静的修飾子を削除した今でも、null が返されます。コードも更新しました。

これは、配列が作成されるクラスです。

public class AssignSeat {

String[] arrangement = new String[12];

public void SeatStart() {

    arrangement[0] = "Collins";
    arrangement[2] = "Faivre";
    arrangement[3] = "Kinnard";
    arrangement[6] = "Morgans";
    arrangement[7] = "Rohan";
    arrangement[8] = "Shatrov";
    arrangement[9] = "Sword";
    arrangement[11] = "Tuckness";

    System.out.format("%-15s%-15s%n", "seat", "passenger");

    for (int i=0; i<arrangement.length; i++) {
        System.out.format("%-15s%-15s%n", i+1, arrangement[i]);

    }

}

public String[] getArrangement() {
    return arrangement;
}

public void setArrangement(String[] arrangement) {
    this.arrangement = arrangement;
}
}

そして、ここに情報にアクセスしようとするメソッドがあります。特に助けが必要なのは for ループなので、間違いがある他の領域は無視してください。ありがとうございました。

public void actionPerformed(ActionEvent event) {
    Scanner scanner = new Scanner(System.in);
    AssignSeat seat = new AssignSeat();

    if(event.getSource() instanceof JButton){

        JButton clickedButton = (JButton) event.getSource();
        String buttonText = clickedButton.getText();

        if (buttonText.equals("first class")) {
            entername.setVisible(true);
            seatnum.setVisible(true);
            confirmed.setVisible(true);
            inputline.setVisible(true);
            outputline.setVisible(true);
            if ((seat.arrangement[1] == null)) {
                System.out.println(seat.arrangement[0]);
                System.out.println(seat.arrangement[2]);
                two.setForeground(Color.green);
            }
        } else if (buttonText.equals("coach")) {
            //System.out.println("so does this!");
            entername.setVisible(true);
            seatnum.setVisible(true);
            confirmed.setVisible(true);
            inputline.setVisible(true);
            outputline.setVisible(true);
            if ((seat.arrangement[4] == null)) {
                five.setForeground(Color.green);
            } 
            if ((seat.arrangement[5] == null)) {
                six.setForeground(Color.green);
            } 
            if ((seat.arrangement[10] == null)) {
                eleven.setForeground(Color.green);
            } 
        }
    }

}
4

5 に答える 5

2

問題は、配列が として宣言されているという事実にありますstaticが、その初期化コードはコンストラクターにあります。元のコードのすべての修飾子を削除し、staticこの部分を置き換えます。

if (AssignSeat.getArrangement()[1].equals("null"))

これとともに:

AssignSeat assign = new AssignSeat();
if (assign.getArrangement()[1] == null)

また"null"、 null 値ではないことに注意しnullてください。そのために (引用符なしで) 使用してください。

別のアプローチは、配列を静的メンバーのままにし、次のように静的に初期化することです。

private static String[] arrangement = new String[12];
static {
    arrangement[0] = "Collins";
    arrangement[2] = "Faivre";
    arrangement[3] = "Kinnard";
    arrangement[6] = "Morgans";
    arrangement[7] = "Rohan";
    arrangement[8] = "Shatrov";
    arrangement[9] = "Sword";
    arrangement[11] = "Tuckness";
}

その場合、これは機能します:

if (AssignSeat.getArrangement()[1] == null)

staticしかし、クラスのいくつかのインスタンスがたまたまその内容を変更している場合、配列を作成することは問題になると私はまだ信じています。

于 2012-04-22T22:00:16.260 に答える
1

交換

if (AssignSeat.getArrangement()[1].equals("null")) 

if (AssignSeat.getArrangement()[1] == null) 

値が の場合、nullメソッド ( など) を呼び出すことはできませんequalsnull値を、文字列ではなく定数である と直接比較する必要があります。

于 2012-04-22T21:59:52.873 に答える
0

最初にオブジェクトをインスタンス化せずに、クラスの属性を使用しようとしています。デフォルト/ユーザー定義のコンストラクターを呼び出すまで、そのオブジェクトの属性専用のメモリはありません。

メソッドを呼び出すことができたとしても、静的メソッドを使用しています。これは、オブジェクトのインスタンスを必要とせずに呼び出すことができます。

オブジェクトのコンストラクターを作成する (またはデフォルトのコンストラクターを使用する) と、オブジェクトがヒープ上にあり、string[] にメモリが割り当てられるため、属性にアクセスできるようになります。

于 2012-04-22T22:42:48.870 に答える
0

わかりました、最初のクラスで何をしようとしているのか、少し混乱しています。インスタンスメソッドから静的配列を初期化しています...

つまり、クラスのインスタンスから SeatStart を呼び出すまで、配列内の String 値は null になります。

AssignSeat の静的コンストラクターから String 配列を初期化して、使用する前に初期化されていることを確認してください: http://www.snippetit.com/2009/05/java-static-variables-static-methods-and-静的コンストラクター/

于 2012-04-22T22:07:03.970 に答える