HOWTO · Java

JavaFX の InvocationTargetException

このチュートリアルでは、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 デモ