InputStream将无法在Runnable JAR

时间:2019-04-17 13:17:17

标签: java image imageview inputstream runnable-jar

我正在为D&D编写字符生成器,​​但是我发现自己处于一种奇怪的情况,因为InputStream类似乎适用于某些文件,所以我得到了: java.lang.NullPointerException:输入流一定不能为空

我正在使用InputStream将javafx Image构造加载到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")));
...

这是构建结果(与在Eclipse上一样在JAR上运行) build result

然后这段代码,应该加载所有D&D竞赛图像<​​/ p>

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

它实际上确实在Eclipse中像这样显示,但是在Runnable jar上报告了错误 eclipse build

这是我的项目结构的图像。

code structure

这是我执行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

注意:我实际上提取了jar所在的RaceImages文件夹,并仅通过命令行运行(不是我想要的解决方案),运行该应用程序 Ambiguous Method

2 个答案:

答案 0 :(得分:0)

如果图像位于src/img/<whatever>文件夹中,则路径应为/img/<whataver>。 重要的是,您可以构建jar(实际上是zip文件),以便图像条目在代码中具有路径,或者您查看jar文件(例如,7zip)并相应地在代码中更正图像路径。 / p>

答案 1 :(得分:0)

我发现了一个try-catch的问题,但我为不及早而感到羞愧。

最终,唯一的错误是图片名称中的单个大写字母被Eclipse绕过,但从.jar运行时导致NullPointerException。

我认为这已解决,并且无需进一步干预

这是一张显示问题的图片

error