InvocaciónTargetException en JavaFX

Sheeraz Gul 15 febrero 2024
InvocaciónTargetException en JavaFX

Este tutorial demuestra cómo resolver la InvocaciónTargetException en JavaFX.

Arreglar InvocaciónTargetException en JavaFX

La excepción InvocationTargetException ocurre cuando estamos usando JavaFX. Las razones por las que se produce esta excepción son:

  1. Cuando escribimos una barra inclinada al comienzo del nombre de la ruta del archivo FXML o la ruta dada no es correcta o no está completa.
  2. Cuando intentamos usar la raíz dinámica pero no hemos configurado la raíz en FXML Loader.
  3. Cuando nos perdemos un Módulo JavaFX.

Probemos un ejemplo que arrojará la InvocaciónTargetException en JavaFX.

package delftstack;

import java.io.File;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Example extends Application {
  @Override
  public void start(Stage DemoStage) throws Exception {
    System.out.println("Start()");
    Parent DemoRoot = FXMLLoader.load(getClass().getResource("delftstack.fxml"));
    DemoStage.setTitle("Demo");
    Scene DemoScene = new Scene(DemoRoot, 200, 150);
    DemoStage.setScene(DemoScene);
    DemoStage.show();
  }
}

El archivo delftstack.fxml es:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <ScrollPane layoutX="178.0" layoutY="68.0" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <content>
            <TableView prefHeight="350.0" prefWidth="590.0">
              <columns>
                  <TableColumn prefWidth="130.0" text="First Name" />
                <TableColumn prefWidth="130.0" text="Last Name" />
                <TableColumn prefWidth="330.0" text="ID" />
              </columns>
            </TableView>
         </content>
      </ScrollPane>
   </children>
</AnchorPane>

El código anterior arrojará la InvocaciónTargetException porque no pudo encontrar el archivo delftstack.fxml. Ver salida:

Start()
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(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
	at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
	at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NullPointerException: Location is required.
	at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3324)
	at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3287)
	at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3255)
	at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3227)
	at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3203)
	at javafx.fxml@18.0.1/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3196)
	at delftstack.Example.start(Example.java:15)
	at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
	at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
	at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at javafx.graphics@18.0.1/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
	at javafx.graphics@18.0.1/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics@18.0.1/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
	... 1 more

Ahora, si tratamos de resolverlo dando la ruta absoluta para el archivo delftstack.fxml, puede resolver el problema, pero para algunos sistemas, todavía puede causar el mismo problema. La mejor solución para este error se da a continuación:

  1. Copie el archivo delftstack.fxml en el mismo directorio de la clase. Por ejemplo, si el archivo de clase está en el paquete delftstack, el archivo FXML debe copiarse en la carpeta project/src/delftstack.
  2. Actualice el proyecto en el IDE. Por ejemplo, en Eclipse, haga clic con el botón derecho en el nombre del proyecto y seleccione Actualizar.
  3. Ejecute el mismo programa y el error se resolverá.

El resultado después de seguir la solución anterior es:

Demostración de FXML

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Artículo relacionado - Java JavaFX

Artículo relacionado - Java Error