InputStream не будет читать изображения в Runnable JAR - PullRequest
0 голосов
/ 17 апреля 2019

Я пишу конструктор символов для D & D, но я нахожусь в странной ситуации, так как класс InputStream, кажется, работает для определенных файлов, тогда я получаю: java.lang.NullPointerException: поток ввода не долженбыть нулевым

Я использую InputStream для загрузки конструкции изображения javafx в конструктор ImageView [new ImageView (new Image (getClass (). getResourceAsStream (..)))];Это работает, когда я загружаю некоторые изображения .jpeg, но не работает, когда я делаю тот же процесс с изображениями .png

Я пробовал много решений, описанных здесь, на StackOverflow, но ни одно из них не получилось слишкомблизко к моей проблеме или помочь вообще:

  • создание папки Source и получение оттуда изображений
  • перемещение файлов изображений в пакет классов
  • чтение всей возможной документации

Этот фрагмент кода работает нормально, в основном считывает изображения и помещает их в качестве фона для некоторых кнопок

ImageView imv;
        for(int i = 1; i <= 8; i++) {
            imv = new ImageView(new Image(getClass().getResourceAsStream("/ButtonImages/" + i + ".jpeg")));
...

, и этоэто результат сборки (работает на JAR, как он работает на Eclipse) build result

Затем этот фрагмент кода должен загрузить все изображения гонок D & D

this.imv = new ImageView(new Image(getClass().getResourceAsStream("/RaceImages/" + displayname + ".png")));

И это действительно такПохоже на это в Eclipse, но там сообщается об ошибке на Runnable jar eclipse build

Это изображение того, как структурирован мой Проект.

code structure

Это то, что я ожидаю, когдаCommon crawl ru Я выполняю свой Runnable JAR expectancy

, и вот что я получаю:

C:\Users\*****\Desktop>java -jar Dnd.jar
Width: 1238.6666666666667       Height: 720.0
Exception in Application start method
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.base/java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Input stream must not be null
        at javafx.graphics/javafx.scene.image.Image.validateInputStream(Unknown Source)
        at javafx.graphics/javafx.scene.image.Image.<init>(Unknown Source)
        at dnd.userinterface.javafx.scene.CharactersPane.<init>(CharactersPane.java:55)
        at dnd.userinterface.javafx.scene.DndPane.bookPane(DndPane.java:199)
        at dnd.userinterface.javafx.scene.DndPane.initPane(DndPane.java:99)
        at dnd.userinterface.javafx.scene.DndPane.<init>(DndPane.java:70)
        at dnd.userinterface.javafx.application.DNDApplication.start(DNDApplication.java:52)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(Unknown Source)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
        ... 1 more

, который явно говорит о том, что я получаю нулевой InputStream при чтении изображений гонки

Примечание: Я фактически извлек папку RaceImages, в которой находится jar-файл, и, запустив ее только через командную строку (не то решение, которое я когда-либо хотел), запускает приложение Ambiguous Method

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я обнаружил проблему с помощью try-catch, и мне стыдно за то, что я не сделал этого раньше.

В конце концов, единственной ошибкой была единственная заглавная буква в названии картинки, которую Eclipse обошел стороной,но привел к NullPointerException при запуске из .jar.

Я считаю, что это решено, и дальнейшее вмешательство не требуется .

Вот изображение, показывающее проблему

error

0 голосов
/ 17 апреля 2019

Если ваши изображения находятся в папке src/img/<whatever>, тогда ваш путь должен быть /img/<whataver>.Важно то, что вы либо создаете свой jar-файл (который, по сути, является zip-файлом), чтобы записи изображений содержали путь в коде, либо вы просматриваете свой jar-файл (например, с 7zip) и соответственно исправляете пути к изображениям в коде.

...