HOWTO · Java

JavaFx のアプリケーション開始方法の例外を修正する

この記事では、JavaFx のアプリケーション開始エラー(アプリケーション開始メソッドの例外)を修正する方法を紹介します。

このページの内容

JavaFX は高度に強化されたライブラリであり、そのコードはネイティブ Java コードで記述されます。ライブラリは、RIA として知られるリッチインターネットアプリケーションの作成に慣れています。

ライブラリは、簡単に理解できるインターフェイスとクラスのセットであり、Java 仮想マシンまたは JVM の使いやすい代替手段です。ライブラリを使用して記述されたコードは、デスクトップ、モバイル、テレビなどの複数のプラットフォームで確実に実行できます。

昔は、グラフィカルユーザーインターフェイスは Swing テンプレートを使用して構築されていましたが、JavaFX の登場後、言語を使用して同じものを簡単に操作できるようになりました。JavaFx を使用して構築されたアプリケーションの普及率は 76%です。

Exception in Application start method は、アプリケーションの実行中およびコンパイルの完了時に発生するランタイムエラーです。この状態は、アプリケーションが実行時変数またはファイルのロードを非効率的に行う場合に発生します。適切に処理されない場合、NullPointerException、FileNotFound タイプの例外がスローされる可能性があります。

さらに、SonarLint、プログラミングミスディテクタ(PMD)などのプラグインは、実際のプログラムを実行せずに、実行時の問題を事前に特定するのに役立つバグを見つけることができます。

以下は、JavaFx の Exception in Application start method エラーを示す例です。

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

public class ApplicationStart extends Application {
  public static void main(String[] args) {
    launch(args);
  }

  @Override
  public void start(Stage stage) throws Exception {
    Parent parent = FXMLLoader.load(getClass().getResource("AnyXML.fxml"));
    Scene scene = new Scene(parent);
    stage.setScene(scene);
    stage.setTitle("First Swing Sample");
    stage.show();
  }
}

JavaFx にあると思われる上記のソースコードには、ApplicationStart クラスに main メソッドがあります。指定されたクラスは、抽象 Application クラスを拡張し、特に JavaFX ライブラリで使用できます。

Caspein と呼ばれるデフォルトのテーマがあり、アプリケーションを起動すると起動します。launch は Application クラスに存在する静的メソッドであり、main 関数から呼び出されます。パラメータとして可変引数または varargs を取ります。launch メソッドが複数回呼び出されると、IllegalStateException がスローされます。

Application クラスには 1つの抽象メソッドがあり、その実装は ApplicationStart クラスに存在する必要があります。override アノテーションは、アノテーションの下のコードが親の Application クラスに属していることを示しています。アノテーションオーバーライドによって進められるメソッドの実装は、アノテーションの下にあります。

main は Java アプリケーションのエントリの場所であるため、start メソッドは JavaFX アプリケーションのメインエントリです。main メソッドは、Application またはメインスレッドが初期化されるときに最初に呼び出されます。

この関数は、パラメーターとして Stage を取ります。ステージは、主要なステップまたはビューを示し、アプリケーションがアプレットビューアで起動したときにロードされます。また、メソッドとともに定義される例外もスローします。

メソッド内の最初のステートメントは、XML ファイルをロードすることです。FXMLLoader クラスは、XML オブジェクトモデルからオブジェクト階層をロードします。これは、FXML ドキュメントから Parent インスタンスにオブジェクト階層を移動するために使用されます。これは、XML ドキュメント階層が存在する場所への URL としてパラメーターを取ります。

結果は、グラフ形式のサブタイプを保持する Parent クラスインスタンスに格納されます。JavaFX ライブラリにある Scene クラスは、すべてのデータをグラフビューに格納するコンテナユニットです。シーンの背景は、指定されたプロパティで塗りつぶされます。Stage クラスのインスタンスが作成され、他のプロパティで使用できるようになります。

以下は、ブラウザ上にシーンを表示するために使用されるプロパティです。

  • setScene メソッドは、シーンを指定するために使用され、ステージインスタンス変数とともに使用されます。
  • setTitle 関数は、ブラウザ上に存在するシーンタイトルを設定するために使用されます。show 関数は、ステージ上のシーンにデータを入力するために使用されます。

以下は、上記のコードブロックの出力です。

Exception in Application start method java.lang.reflect.InvocationTargetException at sun.reflect
    .NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl
    .invoke(NativeMethodAccessorImpl.java : 62) at sun.reflect.DelegatingMethodAccessorImpl
    .invoke(DelegatingMethodAccessorImpl.java : 43) at java.lang.reflect.Method
    .invoke(Method.java : 498) 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(NativeMethodAccessorImpl.java : 62) at sun.reflect.DelegatingMethodAccessorImpl
    .invoke(DelegatingMethodAccessorImpl.java : 43) at java.lang.reflect.Method
    .invoke(Method.java : 498) at sun.launcher.LauncherHelper$FXHelper
    .main(LauncherHelper.java : 873) 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(Thread.java : 748) Caused by
    : java.lang.NullPointerException
    : Location is required.at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java : 3207) 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 ApplicationStart.start(ApplicationStart.java : 15) 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$3(
        WinApplication.java : 177)... 1 more Exception running application ApplicationStart

上記の出力では、FXMLLoader クラスを使用して XML オブジェクトをロードするパラメーター位置で問題が発生しますが、null 値が返されます。簡単に言うと、getResource() メソッドは、関数パラメーターで指定されたパスを見つけません。

したがって、null 値は、実行時例外の一種である NullPointerException を設定します。そして、ファイルを見つけることができる絶対パスを与えることによって処理されます。スタックトレースには、問題が発生し始める行番号が表示されることがよくあります。load パラメータで指定された場合、ターゲットは正しくなければなりません。

したがって、問題に対する与えられた解決策は以下のとおりです。

  1. ファイルが存在する場所への絶対パスを指定します。
  2. 書き込み時に例外を評価または処理するのに役立つ SonarLint プラグインを統合開発環境に追加します。