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(不带引号)。

另一种方法是将数组保留为静态成员,但静态初始化它,如下所示:

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,则不能equals在其上调用方法(如 )。您需要将该值直接与 进行比较null,这是一个常量而不是字符串。

于 2012-04-22T21:59:52.873 回答
0

好的,我对您在头等舱中要做什么感到有些困惑。您正在从实例方法初始化静态数组...

换句话说,数组中的 String 值将是 null,直到您从类的实例调用 SeatStart。

尝试从 AssignSeat 的静态构造函数初始化 String 数组,以确保在使用它之前已对其进行初始化:http ://www.snippetit.com/2009/05/java-static-variables-static-methods-and-静态构造函数/

于 2012-04-22T22:07:03.970 回答
0

您正在尝试使用类的属性,而不首先实例化对象。在您调用默认/用户定义的构造函数之前,没有专门用于该对象属性的内存。

即使您设法调用该方法,您也使用的是静态方法,可以在不需要对象实例的情况下调用该方法。

为对象创建一个构造函数(或使用默认构造函数),然后您将能够访问您的属性,因为您的对象将位于堆上并为字符串 [] 分配了内存。

于 2012-04-22T22:42:48.870 回答
0

只需将 SeaStart 定义为一个数组。

 public String[] SeatStart() {
        arrangement[0] = "Collins";
        arrangement[2] = "Faivre";
        arrangement[3] = "Kinnard";

        return arrangement;
    }

为方便起见,创建一个新数组以从AssignSeat类复制数组。然后从该数组中检索值。

public void actionPerformed(ActionEvent event) {    
    AssignSeat seat = new AssignSeat();

    String[] foo = seat.SeatStart();

    System.out.println(foo[0]);
    System.out.println(foo[1]);
    System.out.println(foo[2]);
}

尽管您也可以通过以下方式访问它:

System.out.println(seat.SeatStart()[0]);

结果将是:

Collins
null
Faivre

并且'null'是因为显然你没有为安排[1]分配一个值:-)

但最终,它奏效了。

于 2017-09-12T07:38:02.973 回答