Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8087872

A null FXML reference in a font property triggers an NPE during Parent.layout()

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P4 P4
    • tbd
    • 8u40
    • javafx
    • None

      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.

            Unassigned Unassigned
            eleponn Eric Le Ponner
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Imported: