Java InputStream赢得';无法在可运行的JAR中读取图像
我正在为D&D编写一个字符生成器,但我发现自己处于一种奇怪的情况,因为InputStream类似乎适用于某些文件,所以我得到了:java.lang.NullPointerException:输入流不能为null 我正在使用InputStream将javafx图像构造函数加载到ImageView构造函数中 [新图像视图(新图像(getClass().getResourceAsStream(..)]; 当我加载一些.jpeg图像时,它会工作,但当我对.png图像执行相同的处理时,它不会工作 我尝试过这里介绍的许多关于StackOverflow的解决方案,但似乎没有一个解决方案与我的问题太接近,或者根本没有帮助:Java InputStream赢得';无法在可运行的JAR中读取图像,java,image,imageview,inputstream,runnable-jar,Java,Image,Imageview,Inputstream,Runnable Jar,我正在为D&D编写一个字符生成器,但我发现自己处于一种奇怪的情况,因为InputStream类似乎适用于某些文件,所以我得到了:java.lang.NullPointerException:输入流不能为null 我正在使用InputStream将javafx图像构造函数加载到ImageView构造函数中 [新图像视图(新图像(getClass().getResourceAsStream(..)]; 当我加载一些.jpeg图像时,它会工作,但当我对.png图像执行相同的处理时,它不会工作 我尝试过
- 创建源文件夹并从中检索图像
- 将图像文件移动到类包中
- 阅读所有可能的文档
ImageView-imv;
for(int i=1;i java-jar Dnd.jar)
宽度:1238.667高度:720.0
应用程序启动方法中的异常
线程“main”java.lang.reflect.InvocationTargetException中出现异常
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(未知源)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(未知源)
位于java.base/java.lang.reflect.Method.invoke(未知源)
位于org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61)
原因:java.lang.RuntimeException:应用程序启动方法中的异常
位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication1(未知源)
位于javafx.graphics/com.sun.javafx.application.launchempl.lambda$launchApplication$2(未知源)
位于java.base/java.lang.Thread.run(未知源)
原因:java.lang.NullPointerException:输入流不能为null
位于javafx.graphics/javafx.scene.image.image.validateInputStream(未知源)
位于javafx.graphics/javafx.scene.image.image。(未知源)
位于dnd.userinterface.javafx.scene.CharactersPane.(CharactersPane.java:55)
位于dnd.userinterface.javafx.scene.DndPane.bookPane(DndPane.java:199)
位于dnd.userinterface.javafx.scene.DndPane.initPane(DndPane.java:99)
位于dnd.userinterface.javafx.scene.DndPane。(DndPane.java:70)
位于dnd.userinterface.javafx.application.DNDApplication.start(DNDApplication.java:52)
在javafx.graphics/com.sun.javafx.application.launchempl.lambda$launchApplication1$9(未知来源)
位于javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(未知来源)
位于javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(未知来源)
位于java.base/java.security.AccessController.doPrivileged(本机方法)
位于javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(未知来源)
在javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(未知源代码)
在javafx.graphics/com.sun.glass.ui.win.WinApplication.\u runLoop(本机方法)
位于javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(未知来源)
…还有一个
它明确地说我在读取比赛图像时得到了一个空的InputStream
注意:我实际上提取了jar所在的RaceImages文件夹,并仅通过命令行运行它(而不是我想要的解决方案),运行应用程序
如果图像位于
src/img/
文件夹中,则路径应为/img/
。
重要的是,您要么构建jar(这是一个有效的zip文件),以便图像条目在代码中具有路径,要么查看jar文件(例如,whith 7zip),并相应地更正代码中的图像路径。我通过try-catch发现了问题,我为之前没有这么做感到羞愧 最终,唯一的错误是图片名称中的一个大写字母被Eclipse绕过,但在从.jar运行时导致NullPointerException 我认为这已经解决,不需要进一步干预 这是一张显示问题的图片
如图()所示,图像不是存储在src中,而是存储在imgsh中。Windows的乐趣在于忽略文件路径中大小写的差异。
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