JavaFX の InvocationTargetException

Sheeraz Gul 2024年2月15日
JavaFX の InvocationTargetException

このチュートリアルでは、JavaFX で InvocationTargetException を解決する方法を示します。

JavaFX の InvocationTargetException を修正

JavaFX を使用している場合、例外 InvocationTargetException が発生します。 この例外が発生する理由は次のとおりです。

  1. FXML ファイルのパス名の先頭にスラッシュを書き込んだ場合、または指定されたパスが正しくないか完全でない場合。
  2. 動的ルートを使用しようとしたが、FXMLローダーにルートを設定していない場合。
  3. JavaFX モジュールが欠落している場合。

JavaFX で InvocationTargetException をスローする例を試してみましょう。

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();
  }
}

delftstack.fxml ファイルは次のとおりです。

<?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>

上記のコードは、delftstack.fxml ファイルが見つからないため、InvocationTargetException をスローします。 出力を参照してください:

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

ここで、ファイル delftstack.fxml の絶対パスを指定して解決しようとすると、問題が解決する場合がありますが、一部のシステムでは、同じ問題が引き続き発生する可能性があります。 このエラーの最適な解決策を以下に示します。

  1. クラスの同じディレクトリに delftstack.fxml ファイルをコピーします。 たとえば、クラス ファイルが delftstack パッケージにある場合、FXML ファイルは project/src/delftstack フォルダーにコピーする必要があります。
  2. IDE でプロジェクトを更新します。 たとえば、Eclipse では、プロジェクト名を右クリックして [更新] を選択します。
  3. 同じプログラムを実行すると、エラーが解決されます。

上記の解決策に従った後の出力は次のとおりです。

FXML デモ

著者: Sheeraz Gul
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

関連記事 - Java JavaFX

関連記事 - Java Error