【问题标题】:InputStream won't read images in Runnable JARInputStream 不会读取 Runnable JAR 中的图像
【发布时间】:2019-09-07 18:04:37
【问题描述】:

我正在为 D&D 编写角色生成器,但我发现自己处于一个奇怪的境地,因为 InputStream 类似乎适用于某些文件,然后我得到:java.lang.NullPointerException: Input stream must not为空

我正在使用 InputStream 将 javafx Image 构造加载到 ImageView 构造中 [新图像视图(新图像(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 上工作)

那么这段代码,应该会加载所有的D&D种族图片

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

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

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

这是我在执行 Runnable JAR 时所期望的

这就是我得到的:

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 文件夹,并仅通过命令行运行它(不是我想要的解决方案),运行应用程序

【问题讨论】:

    标签: java image imageview inputstream runnable-jar


    【解决方案1】:

    我通过 try-catch 发现了这个问题,我为没有早点这样做而感到羞愧。

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

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

    这是显示问题的图片

    【讨论】:

    • Windows 的乐趣 - 忽略文件路径的大小写差异。
    【解决方案2】:

    如果您的图像位于src/img/&lt;whatever&gt; 文件夹中,那么您的路径应该是/img/&lt;whataver&gt;。 重要的是您要么构建您的 jar(有效地是一个 zip 文件),以便图像条目具有代码中的路径,或者您查看您的 jar 文件(例如,使用 7zip)并相应地更正代码中的图像路径。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-14
    • 2014-10-27
    • 1970-01-01
    • 2013-02-20
    • 2012-01-21
    • 2010-11-18
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多