Java 在从一个类访问另一个类时遇到问题
我在将数组数据从一个类传递到下一个类时遇到了一些问题 编辑 我现在不再得到错误,我的代码也会编译,但正如我被警告的那样,数组的每个元素都为null。现在我已经去掉了静态修饰符,它仍然给我空值。我还更新了代码 下面是创建数组的类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
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