问题描述
我有一个运行中的JAR,它使用了来自外部目录的某些资源,而使用了来自其自身的其他资源(使用“ getResourceAsstream”,它们都是图像)。该程序包含一个用JavaFX FXML创建的GUI(以及库“ Controls FX”),该GUI对sqlite数据库进行查询。当我尝试运行launch4j成功创建的.exe文件时,它抛出Arrayindexoutofboundsexception,是指我尝试将ArrayList中的图像分配给按钮的那一行(按钮是FX中包含的普通按钮) )。
我尝试过的事情:
-
更改最小和最大JRE版本。同样的例外。
-
使用相同的建筑属性和相似的图像存储(由使用“ getResourceAsstream”从JAR内部获取图像的静态枚举填充的ArrayList)从不同项目的JAR中创建一个.exe。 。它确实有效,所以问题一定在某个地方。
-
确保在尝试访问数组列表之前,该数组列表已被图像填充(图像的索引为0)。我的意思是,JAR可以完美运行,但是我仍然必须仔细检查。当我在Netbeans或JAR中运行它时,它已被填充,但是奇怪的是,launch4j在显示异常之前不会打印我的消息。
-
尝试通过相对路径而不是从应该存储图像的ArrayList访问图像。异常发生变化,现在它指向另一个类,在该类中,我还尝试访问存储在ArrayList中的图像。如果我也通过相对路径获得该图像,则异常会转移到另一个位置。
-
改为使用Jar2Exe。该exe也会生成,但不会运行。
总而言之:所有异常似乎都与图像的获取有关,当它暗示访问存储在ArrayList中的JAR内部的资源时,某种程度上不起作用,但仅适用于该特定项目(它在另一个项目中起作用) )和.exe文件(可在Netbeans和JAR中使用)。
谢谢。
launch4j中的堆栈跟踪:
Executing: C:\Users\Setito\Desktop\dam\Proyecto_fin_de_grado\PVZHeroes-Stats\PVZHeroes-Stats.exe
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(UnkNown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(UnkNown Source)
at java.lang.reflect.Method.invoke(UnkNown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(UnkNown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(UnkNown Source)
at java.lang.reflect.Method.invoke(UnkNown Source)
at sun.launcher.LauncherHelper$FXHelper.main(UnkNown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
at java.lang.Thread.run(UnkNown Source)
Caused by: javafx.fxml.LoadException:
file:/C:/Users/Setito/Desktop/dam/Proyecto_fin_de_grado/PVZHeroes-Stats/PVZHeroes-Stats.exe!/pvzheroes/clases/FXMLDocument.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at pvzheroes.clases.PVZHeroesstats.start(PVZHeroesstats.java:28)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
at com.sun.glass.ui.invokelaterdispatcher$Future.run(invokelaterdispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$4(WinApplication.java:186)
... 1 more
Caused by: java.lang.indexoutofboundsexception: Index: 0,Size: 0
at java.util.ArrayList.rangeCheck(UnkNown Source)
at java.util.ArrayList.get(UnkNown Source)
at pvzheroes.clases.inicializaciónComponentes.ConfigurarBotón(inicializaciónComponentes.java:98)
at pvzheroes.clases.inicializaciónComponentes.<init>(inicializaciónComponentes.java:59)
at pvzheroes.clases.FXMLDocumentController.initialize(FXMLDocumentController.java:584)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
... 17 more
Exception running application pvzheroes.clases.PVZHeroesstats
代码的相关部分是:
- 包含jar文件中路径的枚举:
public static enum RUTAS_DENTRO_DE_JAR {
TIPOS("métodosCompartidos/iconosTipos"),// More paths
public String ruta;
RUTAS_DENTRO_DE_JAR(String cadena) {
ruta = cadena;
}
- 称为用图像填充ArrayList的方法的部分。
private static ArrayList<Image> ICONOS_TIPOS = new MétodosCompartidos().AsignarImágenesJAR(constantes.RUTAS_DENTRO_DE_JAR.TIPOS.ruta,MétodosCompartidos.class);
- 获取图像并返回ArrayList的方法(它使用另一种方法:“ ObtenerNombresDirectorioJAR”,该方法从第一个参数表示的特定JAR目录返回所有文件名,从第二个参数定义的类开始)。 / li>
public static ArrayList<Image> AsignarImágenesJAR(String ruta,Class clase) throws IOException {
ArrayList<String> ArrayNombres = ObtenerNombresDirectorioJAR(ruta,clase);
ArrayList<Image> ArrayImágenes = new ArrayList<>();
/**
* Rellenamos ArrayImágenes con las imágenes
*/
try {
for (int i = 0; i < ArrayNombres.size(); i++) {
Image imagen = new Image(MétodosCompartidos.class.getResourceAsstream(ArrayNombres.get(i)));
ArrayImágenes.add(imagen);
}
} catch (NullPointerException e) {
new DiálogoGenérico(constantes.TIPOS_DIÁlogo.SIN_FONDOS.Cadena);
System.exit(0);
}
return ArrayImágenes;
}
c.ImagenesBoton = constantes.IMÁGEnes.TIPOSG.Comunes;
c.ImagenBotón.setimage(c.ImagenesBoton.get(0));
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)