JavaFX:在Netbeans中使用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

我试图通过创建一个数组,然后使用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: 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
    列表
    ?另外,您为5
    VBox
    分配了空间,但实际数组中没有任何内容。使用
    new VBox[5]
    创建的数组用
    null
    元素初始化。为什么不使用
    ArrayList
    列表
    ?另外,您为5
    VBox
    分配空间,但实际数组中没有任何内容。使用
    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)