我的Java类有问题。实际上代码是正确的,但如果我点击运行按钮,则会导致图像路径异常。
static Image currentBackground = new Image("Snake/Images/background_options.png", true);
编译器的消息是:
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:122)
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1100)
at javafx.scene.image.Image.<init>(Image.java:624)
at view.OptionsWindow.<clinit>(OptionsWindow.java:21)
... 3 more
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1092)
... 5 more
使用退出代码1完成处理
任何人都可以帮助我吗?
答案 0 :(得分:5)
Image
constructor期望指定 URL ,而不是文件系统路径。假设您将此映像作为应用程序的一部分进行捆绑,则需要在加载类的同一位置加载该映像:可能是最终部署中的jar文件,但可能是在开发期间来自文件系统。
获取表示属于应用程序的资源的URL的机制是在Class
或ClassLoader
上调用getResource()
。
执行此操作的确切方法取决于您尚未显示的项目结构,但例如:
new Image(getClass().getResource("Snake/Images/background_options.png").toString(), true);
将从相对于当前类指定的资源加载图像,
new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);
将从相对于类路径指定的资源加载图像。
如果您传递代表相对网址的String
(即没有方案的网址,例如file:
,http:
或jar:
),那么Image
构造函数将搜索资源的类路径。换句话说
new Image("Snake/Images/background_options.png", true);
相当于
new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);
这似乎有点违反直觉(至少对我而言),所以我更喜欢完全指定网址,或者根据需要从getClass().getResource()
或File.toURI().toURL()
中检索网址。