【问题标题】:JavaFX: Error on using an Array of VBox in NetbeansJavaFX:在 Netbeans 中使用 VBox 数组时出错
【发布时间】:2017-09-15 19:57:35
【问题描述】:

我正在尝试通过创建一个数组来创建几个 VBox,然后使用这样的 for 循环设置它们的属性:

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 的新手,如果我做错了什么,请见谅。

【问题讨论】:

  • 为什么不使用ArrayListList?此外,您为 5 VBox 分配空间,但实际数组中没有任何内容。
  • 使用new VBox[5] 创建的数组使用null 元素进行初始化。

标签: javafx


【解决方案1】:

这里有一个非常简单的解释:

如果您使用代码创建Array

VBox boxes[] = new VBox[5];


您创建了一种带有 5 个抽屉 的盒子(在我的例子中是 8 个,因为我没有其他图片)...

所以你的Array 看起来像这样:

每个抽屉都包含空值,因为VBox boxes[] = new VBox[5]; 行只创建了一个带有“空箭头”的空框。 这就是为什么您的 for 会抛出 NullPointerExeption

那我该怎么办? 您必须初始化这些框...

示例:

boxes[0] = new VBox();

但为什么是[0]?因为Array 开始按 id = 0 计数

在这之后你的盒子看起来像这样:

----总结----

  1. 创建一个空框:VBox boxes[] = new VBox[5];
  2. 初始化这些抽屉:boxes[0] = new VBox();, boxes[1] = new VBox();, ...
  3. 您的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();
}

或者

Stream.generate(VBox::new).limit(5).toArray(VBox[]::new);

(感谢费边)

【讨论】:

  • VBoxes 的创建可能应该通过循环(或使用流)来完成。这样可以更简单地修改数组大小并保持代码 DRY。 for (int i = 0; i &lt; boxes.length; i++) { boxed[i] = new VBox();} Stream.generate(VBox::new).limit(5).toArray(VBox[]::new);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2014-11-26
  • 2016-11-15
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多