NullPointerException загрузить fxml
Я хочу загрузить файл fxml в свое приложение. Я использую следующий код:
try {
FXMLLoader loader = new FXMLLoader();
loader.setController(null);
loader.setRoot(null);
loader.setResources(ResourceBundle.getBundle(BUNDLE));
Node root = null;
root = (Node) loader.load(JfxUtils.class.getResource(fxml).openStream());
return root;
} catch (IOException e) {
throw new IllegalStateException("cannot load FXML screen", e);
}
С некоторыми fxml все работает нормально, с другими я получаю это исключение:
Caused by: java.lang.NullPointerException
at javafx.fxml.FXMLLoader.equals(FXMLLoader.java:1856)
at javafx.fxml.FXMLLoader.isCyclic(FXMLLoader.java:1868)
at javafx.fxml.FXMLLoader.access$2100(FXMLLoader.java:71)
at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:941)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:570)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2356)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2172)
Я не понимаю, почему я получаю это исключение.
Благодарю.
РЕДАКТИРОВАТЬ: Добавить включить пример:
Мой родитель fxml
<fx:root type="javafx.scene.layout.AnchorPane" fx:id="scrollPane" id="scrollStocksList"
xmlns:fx="http://javafx.com/fxml"
fx:controller="net.StocksListRunningController">
<fx:include fx:id="tableListStock"
source="/fxml/stocksList.fxml" />
</fx:root>
Мой включаемый файл:
<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml"
fx:controller="net.StockListTableController">
<TableView fx:id="stocksList" onMouseClicked="#openDetail">
<columns>
<TableColumn text="Titre" prefWidth="125">
<cellValueFactory>
<PropertyValueFactory property="title" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Quantité" prefWidth="75" fx:id="quantityColumn">
<cellValueFactory>
<PropertyValueFactory property="quantity" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Prix unitaire" prefWidth="100">
<cellValueFactory>
<PropertyValueFactory property="unitPrice" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Prix total" prefWidth="120">
<cellValueFactory>
<PropertyValueFactory property="price" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Sens" prefWidth="50">
<cellValueFactory>
<PropertyValueFactory property="direction" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Date d'achat" prefWidth="100">
<cellValueFactory>
<PropertyValueFactory property="date" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Jours écoulés" prefWidth="100">
<cellValueFactory>
<PropertyValueFactory property="dayRunning" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
</fx:root>
2 ответа
Вот решение.
Добавьте эту строку для загрузчика:
loader.setLocation(JfxUtils.class.getResource(fxml));
Очень плохая ошибка.
Правильный синтаксис для загрузки fxml:
FXMLLoader.load(getClass().getResource("fxml_tableview.fxml"));
Причина вашего исключения NullPointerException, вероятно, связана с тем, что я не вижу никакого определения вашего fxml
переменная. Кроме того, я не уверен насчет этого бита.openStream() в конце вашего.
см. здесь для получения дополнительной информации о FXML.
РЕДАКТИРОВАТЬ
В свете комментариев, есть..3 или около того места, где я вижу, что вы могли бы получить этот NPE.
Место № 1) Загрузчик имеет значение null, так как мы видим, что это явно не так, это не проблема. место №2) JfxUtils - несуществующий элемент, но, исходя из ошибки, это тоже не так. Поместите #3, getResource(fxml) возвращает нуль, потому что он либо указывает на то, что не существует, возвращая ноль, и вы не можете открыть поток для нулевого объекта.
эта строка: at javafx.fxml.FXMLLoader.isCyclic(FXMLLoader.java:1868)
за исключением, что выделяется для меня, хотя у меня нет времени, чтобы в эту секунду погрузиться и исследовать его. Что-то в моей кишке говорит мне, что причина некоторых странностей может быть связана с этим.