NullPointerException после создания банки - PullRequest
0 голосов
/ 04 мая 2020

У меня есть проект JavaFX, который я разрабатываю с IntelliJ, и когда я запускаю программу оттуда, все работает нормально. Но когда я запускаю mvn clean package и пытаюсь запустить собранную банку, я получаю следующее Exception:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
        at de.application.component.main.FilterListCell.setParent(FilterListCell.java:212)
        at de.application.controller.MainController.lambda$initialize$2(MainController.java:183)
        at javafx.scene.control.skin.ListViewSkin.createCell(ListViewSkin.java:432)
        at javafx.scene.control.skin.ListViewSkin.lambda$new$9(ListViewSkin.java:207)
        at javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1672)
        at javafx.scene.control.skin.VirtualFlow.getCellLength(VirtualFlow.java:1801)
        at javafx.scene.control.skin.VirtualFlow.computeViewportOffset(VirtualFlow.java:2639)
        at javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1245)
        at javafx.scene.Parent.layout(Parent.java:1204)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Parent.layout(Parent.java:1211)
        at javafx.scene.Scene.doLayoutPass(Scene.java:576)
        at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2482)
        at com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:412)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:411)
        at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:438)
        at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:519)
        at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:499)
        at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:492)
        at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:320)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
        at java.base/java.lang.Thread.run(Thread.java:834)

Эта строка завершается ошибкой:

public void setParent(ListView<CompositeFilter> parent) {
    this.parent = parent;
    root.prefWidthProperty().bind(parent.widthProperty().subtract(16)); // this fails
}

root - это то, что я не понимаю, потому что я объявляю это в контроллере следующим образом:

    @FXML
    public AnchorPane root;

, а это файл f xml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
            minWidth="-Infinity" prefHeight="200.0" xmlns="http://javafx.com/javafx/11.0.1"
            xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="de.application.component.main.FilterListCell">
  <HBox alignment="CENTER_LEFT" AnchorPane.leftAnchor="8.0" AnchorPane.topAnchor="8.0" AnchorPane.rightAnchor="8.0">
   <!-- some content -->
  </HBox>
</AnchorPane>

У меня есть понятия не имею, почему это так, я проверил, что IntelliJ использует тот же JDK, что и я.
Может быть, это проблема с моим помом?

Вот оно:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>de.group</groupId>
  <artifactId>application</artifactId>
  <version>0.1-SNAPSHOT</version>

  <properties>
    <java.version>11</java.version>
    <javafx.version>11.0.2</javafx.version>
    <maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
  </properties>

  <dependencies>
    <!-- JavaFX -->
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>${javafx.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>${javafx.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>${javafx.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-base</artifactId>
      <version>${javafx.version}</version>
    </dependency>

    <dependency>
      <groupId>org.controlsfx</groupId>
      <artifactId>controlsfx</artifactId>
      <version>11.0.1</version>
    </dependency>
    <!-- Spring Boot -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
    </dependency>

    <!-- Other -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.module</groupId>
      <artifactId>jackson-module-parameter-names</artifactId>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jdk8</artifactId>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>

    <dependency>
      <groupId>net.rgielen</groupId>
      <artifactId>javafx-weaver-spring</artifactId>
      <version>1.2.0</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>

    <!-- Test -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven.compiler.plugin.version}</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

Вся помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ

Фрагмент кода из MainController - это

lstFilter.setCellFactory(compositeFilterListView -> {
            FxControllerAndView<FilterListCell, Node> cell = fxWeaver.load(FilterListCell.class);
            if(cell.getView().isPresent()) {
                cell.getView().get().setVisible(false);
                cell.getController().setGraphic(cell.getView().get());
            }
            cell.getController().setParent(lstFilter); // setParent fails
            return cell.getController();
        });

Это просто CellFactory для Listview lstFilter. Настоящая проблема заключается в несоответствии между запуском через Intellij, где эта ошибка не возникает, и запуском встроенного jar через командную строку, где это не удается.

1 Ответ

0 голосов
/ 04 мая 2020

Итак, я нашел решение своей проблемы:

Проблема заключалась в том, что мой файл f xml не был найден. Я до сих пор не уверен, почему. Класс контроллера назывался FilterListView, а мой файл f xml filterListView.fxml. Теперь я переименовал файл f xml в FilterListView.fxml, и он работает.

Кто-нибудь знает, почему classpath кажется чувствительным к регистру при запуске jar и нечувствительным к регистру при запуске из IDE?

...