InputStream 不会读取 Runnable JAR 中的图像
InputStream won't read images in Runnable JAR
我正在为 D&D 编写一个角色构建器,但我发现自己处于一种奇怪的情况,因为 InputStream class 似乎适用于某些文件,然后我得到:java.lang.NullPointerException:输入流不能为空
我正在使用 InputStream 将 javafx Image 构造函数加载到 ImageView 构造函数中
[新 ImageView(新图像(getClass().getResourceAsStream(..)))];
当我加载一些 .jpeg 图像时它起作用,但当我对 .png 图像执行相同的过程时它不起作用
我已经尝试过 Whosebug 上描述的许多解决方案,但 none 似乎太接近我的问题或根本没有帮助:
- creating a Source folder and retrieving the images from there
- moving the image files to the class package
- reading all the possible documentation
这段代码工作正常,基本上读取图像并将它们作为某些按钮的背景
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(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(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(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(Unknown Source)
... 1 more
这明确表示我在阅读比赛图像时得到了一个空的 InputStream
注意: 我实际上提取了 jar 所在的 RaceImages 文件夹,并且 运行 仅通过命令行(不是我想要的解决方案) , 运行应用程序
如果您的图像在 src/img/<whatever>
文件夹中,那么您的路径应该是 /img/<whataver>
。
重要的是,您要么构建 jar(实际上是一个 zip 文件),以便图像条目在代码中具有路径,要么查看您的 jar 文件(例如 7zip)并相应地更正代码中的图像路径。
我发现了 try-catch 的问题,我为没有早点这样做而感到羞愧。
最终,唯一的错误是图片名称中的单个大写字母被 Eclipse 绕过,但在 运行 from .jar.
时导致 NullPointerException
我认为这已解决,不需要进一步干预。
这是显示问题的图片
我正在为 D&D 编写一个角色构建器,但我发现自己处于一种奇怪的情况,因为 InputStream class 似乎适用于某些文件,然后我得到:java.lang.NullPointerException:输入流不能为空
我正在使用 InputStream 将 javafx Image 构造函数加载到 ImageView 构造函数中 [新 ImageView(新图像(getClass().getResourceAsStream(..)))]; 当我加载一些 .jpeg 图像时它起作用,但当我对 .png 图像执行相同的过程时它不起作用
我已经尝试过 Whosebug 上描述的许多解决方案,但 none 似乎太接近我的问题或根本没有帮助:
- creating a Source folder and retrieving the images from there
- moving the image files to the class package
- reading all the possible documentation
这段代码工作正常,基本上读取图像并将它们作为某些按钮的背景
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(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(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(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(Unknown Source)
... 1 more
这明确表示我在阅读比赛图像时得到了一个空的 InputStream
注意: 我实际上提取了 jar 所在的 RaceImages 文件夹,并且 运行 仅通过命令行(不是我想要的解决方案) , 运行应用程序
如果您的图像在 src/img/<whatever>
文件夹中,那么您的路径应该是 /img/<whataver>
。
重要的是,您要么构建 jar(实际上是一个 zip 文件),以便图像条目在代码中具有路径,要么查看您的 jar 文件(例如 7zip)并相应地更正代码中的图像路径。
我发现了 try-catch 的问题,我为没有早点这样做而感到羞愧。
最终,唯一的错误是图片名称中的单个大写字母被 Eclipse 绕过,但在 运行 from .jar.
时导致 NullPointerException我认为这已解决,不需要进一步干预。
这是显示问题的图片