日々常々

ふつうのプログラマがあたりまえにしたいこと。

ようやくJavaFX8さんを触ってみたところ

JavaFX8が出て1年たちましたが、ようやく触ってみようと思いたったので、新幹線の中でGetting Startedを叩いてました。

なかなかいい感じにこなれてきて、動かすのにミニマムなコードはこの程度になりました。

import javafx.application.Application;
import javafx.stage.Stage;

public class HelloWorld extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.show();
    }
}

やらなきゃいけないのは二つだけ。 javafx.application.Application を継承して javafx.stage.Stage#show を呼び出す。 こいつをMainクラスとして普通にjavaコマンドとかで実行するだけでウィンドウが出る。

最小構成の小ささは重要で、一言で済むとそれだけでパワーを持ちます。 「あれやって、それやって、これやって、そうそうあれもあった、で、こうして……ほらできた!簡単でしょ?」と言っても、できる人以外は誰も共感なんてしてくれませんしね。

mainメソッドさん

JavaFX2の頃は以下のようなmainメソッドが必要でしたが、今はいらなくなっているみたい。

    public static void main(String[] args) {
        launch(args);
    }

mainメソッドがなくても普通にIDEからでも実行できる。捗る。 てことで書かずにやってたんだけど、なんかうまく動かない時があった。たとえばこんなコード。

    @Override
    public void start(Stage primaryStage) {
        primaryStage.show();
        throw new RuntimeException("hoge");
    }

IntelliJ IDEAさんで実行した場合で、startメソッドが例外を投げた場合に変な出方する。

Exception in Application start method
Exception in thread "main" java.lang.NoSuchMethodException:HelloWorld.main([Ljava.lang.String;)
    at java.lang.Class.getMethod(Class.java:1786)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:125)

Process finished with exit code 1

mainメソッド書いてたらちゃんと例外内容出てくれる。

Exception in Application start method
Exception in thread "main" 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$152(LauncherImpl.java:182)
    at com.sun.javafx.application.LauncherImpl$$Lambda$2/1896277646.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: hoge
    at HelloWorld.start(HelloWorld.java:9)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863)
    (省略)

ふむ。

ちなみに NoSuchMethodException になるのはRunで実行した時だけで、Debugで実行した時はちゃんと投げた例外のスタックトレースが出てくれる。IntelliJ IDEA使わずにjavaコマンドで実行した時は問題ない。 なんじゃろなーとIDEAさんのバグトラッカーさんを検索(これでいいのかな)してるんだけど見当たらない。 とりあえず忘れそうなのでメモがてらブログにかいとく。