Java 在从一个类访问另一个类时遇到问题

Java 在从一个类访问另一个类时遇到问题,java,arrays,scope,variable-assignment,Java,Arrays,Scope,Variable Assignment,我在将数组数据从一个类传递到下一个类时遇到了一些问题 编辑 我现在不再得到错误,我的代码也会编译,但正如我被警告的那样,数组的每个元素都为null。现在我已经去掉了静态修饰符,它仍然给我空值。我还更新了代码 下面是创建数组的类 public class AssignSeat { String[] arrangement = new String[12]; public void SeatStart() { arrangement[0] = "Collins"; arrang

我在将数组数据从一个类传递到下一个类时遇到了一些问题

编辑 我现在不再得到错误,我的代码也会编译,但正如我被警告的那样,数组的每个元素都为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;
}
}
替换

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


如果该值为
null
,则不能对其调用方法(如
equals
)。您需要将该值直接与
null
进行比较,后者是常量而不是字符串。

问题在于数组声明为
静态
,但它的初始化代码在构造函数中。删除原始代码中的所有
静态
修饰符,并更换此部件:

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)

但是我仍然相信,如果类的多个实例碰巧修改了它的内容,那么将数组
设置为静态将是有问题的。

好的,我对第一个类中要做的事情有点困惑。您正在从实例方法初始化静态数组

换句话说,在从类的实例调用SeatStart之前,数组中的字符串值将为null


尝试从AssignSeat的静态构造函数初始化字符串数组,以确保在使用它之前已对其进行初始化:

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

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


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

只需将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]分配值:-)


但最终,它还是可以工作的。

您确定在尝试访问元素
1
之前调用了初始化数组的构造函数吗?为什么?他正在为静态变量正确访问它。@AdamLiss他误解了如何使用静态成员。他在构造函数中初始化数组,但是静态访问它,显然数组还没有初始化。介意取消否决票吗?我没有否决。。。我反而问了这个问题。但问题不是静态声明,而是初始化。我建议您更改您的答案,以显示正确的初始化,这可能对OP非常有帮助。我只是扩展了我的答案,以使其更清楚,无论是谁在没有评论原因的情况下否决了@Óscar López感谢您提供了这样一个深入的答案。我不清楚的一件事是,当我删除所有东西上的静态修饰符时,setter方法仍然建议我重新添加它,并导致编译错误。这完美地解决了问题,只是在你的答案中有一个额外的“标记”。谢谢!
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]);
}
Collins
null
Faivre