JavaFX:在Netbeans中使用VBox数组时出错
我试图通过创建一个数组,然后使用for循环设置它们的属性来创建几个VBox,如下所示:JavaFX:在Netbeans中使用VBox数组时出错,javafx,Javafx,我试图通过创建一个数组,然后使用for循环设置它们的属性来创建几个VBox,如下所示: VBox boxes[] = new VBox[5]; for(VBox box : boxes) { box.setMaxSize(150, 150); box.setMinSize(150, 150); box.setAlignment(Pos.CENTER); box.setStyle("-fx-border-style: sol
VBox boxes[] = new VBox[5];
for(VBox box : boxes) {
box.setMaxSize(150, 150);
box.setMinSize(150, 150);
box.setAlignment(Pos.CENTER);
box.setStyle("-fx-border-style: solid; -fx-bordor-color: black; -fx-bordor-width: 1px;");
}
代码构建得很好,但每次运行时都会出现以下错误:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at javafxhelloworld.JavaFXHelloWorld.start(JavaFXHelloWorld.java:36)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
... 1 more
Exception running application javafxhelloworld.JavaFXHelloWorld
我试着用一个普通的for循环来解释它,但它仍然会给我同样的错误。我正在为此使用Netbeans。我的问题是,发生了什么事?我怎么修理它?我是JavaFX新手,如果我做了一些明显错误的事情,请原谅。这里有一个非常简单的解释:
for (int i = 0; i < boxes.length; i++) {
boxed[i] = new VBox();
}
如果使用代码创建数组
:
VBox-box[]=新的VBox[5]代码>
您创建了一种带有5个抽屉的盒子(在我的例子中是8个,因为我没有其他图片)
因此,您的数组
如下所示:
每个抽屉都包含null,因为VBox-box[]=new-VBox[5]代码>行仅创建带有“空箭头”的空框这就是为什么您的for
会抛出空点执行选项
那我该怎么办呢
您必须初始化这些框
样本:
boxes[0] = new VBox();
但是为什么[0]
?因为数组开始按id=0计数
在此之后,您的框看起来如下所示:
----总结---
创建一个空框:VBox-box[]=new-VBox[5]代码>
初始化这些抽屉:box[0]=new VBox()代码>,框[1]=新的VBox()代码>
您的for
正在运行
请注意,您也可以通过以下方式初始化该框:
VBox boxes[] = {new VBox(), new VBox(), new VBox(), ...};
这将保存以下行:
boxes[0] = new VBox();
最好的方法是(因为它是动态的):
for (int i = 0; i < boxes.length; i++) {
boxed[i] = new VBox();
}
(感谢费边)这里有一个非常简单的解释:
for (int i = 0; i < boxes.length; i++) {
boxed[i] = new VBox();
}
如果使用代码创建数组
:
VBox-box[]=新的VBox[5]代码>
您创建了一种带有5个抽屉的盒子(在我的例子中是8个,因为我没有其他图片)
因此,您的数组
如下所示:
每个抽屉都包含null,因为VBox-box[]=new-VBox[5]代码>行仅创建带有“空箭头”的空框这就是为什么您的for
会抛出空点执行选项
那我该怎么办呢
您必须初始化这些框
样本:
boxes[0] = new VBox();
但是为什么[0]
?因为数组开始按id=0计数
在此之后,您的框看起来如下所示:
----总结---
创建一个空框:VBox-box[]=new-VBox[5]代码>
初始化这些抽屉:box[0]=new VBox()代码>,框[1]=新的VBox()代码>
您的for
正在运行
请注意,您也可以通过以下方式初始化该框:
VBox boxes[] = {new VBox(), new VBox(), new VBox(), ...};
这将保存以下行:
boxes[0] = new VBox();
最好的方法是(因为它是动态的):
for (int i = 0; i < boxes.length; i++) {
boxed[i] = new VBox();
}
(感谢fabian)为什么不使用ArrayList
或列表
?另外,您为5VBox
分配了空间,但实际数组中没有任何内容。使用new VBox[5]
创建的数组用null
元素初始化。为什么不使用ArrayList
或列表
?另外,您为5VBox
分配空间,但实际数组中没有任何内容。使用new VBox[5]
创建的数组使用null
元素初始化。可能应该从循环(或使用流)创建VBox
es。通过这种方式,修改数组大小更简单,并且可以保持代码干燥for(int i=0;i
或Stream.generate(VBox::new).limit(5).toArray(VBox[]::new)
可能应该从循环(或使用流)创建VBox
es。通过这种方式,修改数组大小更简单,并且可以保持代码干燥for(int i=0;i
或Stream.generate(VBox::new).limit(5).toArray(VBox[]::new)代码>