If you (inadvertently) writes this in your FXML file:
<Button font="$undefinedFxId" />
the FXML text is loaded successfully by FXMLLoader,
but calling Parent.layout() triggers the following NPE because
font property has been set to null:
java.lang.NullPointerException
at com.sun.javafx.scene.control.skin.Utils.computeTextWidth(Utils.java:118)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.computeMinLabeledPartWidth(LabeledSkinBase.java:661)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.computeMinWidth(LabeledSkinBase.java:633)
at javafx.scene.control.Control.computeMinWidth(Control.java:468)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.Region.computeChildMinAreaWidth(Region.java:1667)
at javafx.scene.layout.Region.getMaxAreaWidth(Region.java:1996)
at javafx.scene.layout.Region.computeMaxMinAreaWidth(Region.java:1833)
at javafx.scene.layout.VBox.computeMinWidth(VBox.java:388)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.Region.computeChildPrefAreaWidth(Region.java:1728)
at javafx.scene.layout.BorderPane.getAreaWidth(BorderPane.java:610)
at javafx.scene.layout.BorderPane.computeMinWidth(BorderPane.java:388)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.Region.computeChildMinAreaWidth(Region.java:1667)
at javafx.scene.layout.BorderPane.getAreaWidth(BorderPane.java:609)
at javafx.scene.layout.BorderPane.computeMinWidth(BorderPane.java:368)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.AnchorPane.computeWidth(AnchorPane.java:274)
at javafx.scene.layout.AnchorPane.computeMinWidth(AnchorPane.java:242)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.Node.autosize(Node.java:2865)
at javafx.scene.Parent.layoutChildren(Parent.java:1105)
at javafx.scene.Group.layoutChildren(Group.java:226)
at javafx.scene.Parent.layout(Parent.java:1076)
at javafx.scene.SubScene.layoutPass(SubScene.java:686)
at javafx.scene.Parent.layout(Parent.java:1084)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Group.prefWidth(Group.java:182)
at javafx.scene.Group.minWidth(Group.java:216)
at javafx.scene.layout.Region.computeChildPrefAreaWidth(Region.java:1728)
at javafx.scene.layout.Region.getMaxAreaWidth(Region.java:1997)
at javafx.scene.layout.Region.computeMaxPrefAreaWidth(Region.java:1866)
at javafx.scene.layout.StackPane.computePrefWidth(StackPane.java:297)
at javafx.scene.Parent.prefWidth(Parent.java:904)
at javafx.scene.layout.Region.prefWidth(Region.java:1419)
at javafx.scene.layout.Region.minWidth(Region.java:1385)
at com.sun.javafx.scene.control.skin.ScrollPaneSkin.computeScrollNodeSize(ScrollPaneSkin.java:930)
at com.sun.javafx.scene.control.skin.ScrollPaneSkin.layoutChildren(ScrollPaneSkin.java:822)
at javafx.scene.control.Control.layoutChildren(Control.java:576)
at javafx.scene.Parent.layout(Parent.java:1076)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
...
Of course, it's invalid FXML (forward references are not permitted).
However, since FXML Loader is resilient and continue to load the file,
I think it would make sense that FX layout be resilient too and avoid breaking on NPE.
<Button font="$undefinedFxId" />
the FXML text is loaded successfully by FXMLLoader,
but calling Parent.layout() triggers the following NPE because
font property has been set to null:
java.lang.NullPointerException
at com.sun.javafx.scene.control.skin.Utils.computeTextWidth(Utils.java:118)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.computeMinLabeledPartWidth(LabeledSkinBase.java:661)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.computeMinWidth(LabeledSkinBase.java:633)
at javafx.scene.control.Control.computeMinWidth(Control.java:468)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.Region.computeChildMinAreaWidth(Region.java:1667)
at javafx.scene.layout.Region.getMaxAreaWidth(Region.java:1996)
at javafx.scene.layout.Region.computeMaxMinAreaWidth(Region.java:1833)
at javafx.scene.layout.VBox.computeMinWidth(VBox.java:388)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.Region.computeChildPrefAreaWidth(Region.java:1728)
at javafx.scene.layout.BorderPane.getAreaWidth(BorderPane.java:610)
at javafx.scene.layout.BorderPane.computeMinWidth(BorderPane.java:388)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.Region.computeChildMinAreaWidth(Region.java:1667)
at javafx.scene.layout.BorderPane.getAreaWidth(BorderPane.java:609)
at javafx.scene.layout.BorderPane.computeMinWidth(BorderPane.java:368)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.layout.AnchorPane.computeWidth(AnchorPane.java:274)
at javafx.scene.layout.AnchorPane.computeMinWidth(AnchorPane.java:242)
at javafx.scene.Parent.minWidth(Parent.java:932)
at javafx.scene.layout.Region.minWidth(Region.java:1383)
at javafx.scene.Node.autosize(Node.java:2865)
at javafx.scene.Parent.layoutChildren(Parent.java:1105)
at javafx.scene.Group.layoutChildren(Group.java:226)
at javafx.scene.Parent.layout(Parent.java:1076)
at javafx.scene.SubScene.layoutPass(SubScene.java:686)
at javafx.scene.Parent.layout(Parent.java:1084)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Group.prefWidth(Group.java:182)
at javafx.scene.Group.minWidth(Group.java:216)
at javafx.scene.layout.Region.computeChildPrefAreaWidth(Region.java:1728)
at javafx.scene.layout.Region.getMaxAreaWidth(Region.java:1997)
at javafx.scene.layout.Region.computeMaxPrefAreaWidth(Region.java:1866)
at javafx.scene.layout.StackPane.computePrefWidth(StackPane.java:297)
at javafx.scene.Parent.prefWidth(Parent.java:904)
at javafx.scene.layout.Region.prefWidth(Region.java:1419)
at javafx.scene.layout.Region.minWidth(Region.java:1385)
at com.sun.javafx.scene.control.skin.ScrollPaneSkin.computeScrollNodeSize(ScrollPaneSkin.java:930)
at com.sun.javafx.scene.control.skin.ScrollPaneSkin.layoutChildren(ScrollPaneSkin.java:822)
at javafx.scene.control.Control.layoutChildren(Control.java:576)
at javafx.scene.Parent.layout(Parent.java:1076)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
at javafx.scene.Parent.layout(Parent.java:1082)
...
Of course, it's invalid FXML (forward references are not permitted).
However, since FXML Loader is resilient and continue to load the file,
I think it would make sense that FX layout be resilient too and avoid breaking on NPE.
- relates to
-
JDK-8097233 FXML crashes SceneBuilder 2.0
-
- Closed
-