Integrated: 8357157: Exception thrown from AnimationTimer freezes application

Michael Strauß mstrauss at openjdk.org
Thu May 22 10:25:01 UTC 2025


On Fri, 16 May 2025 14:38:20 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:

> When an exception is thrown from `AnimationTimer::handle`, the JavaFX application freezes. The reason is that the user exception will bubble up into framework code, preventing the normal operation of JavaFX.
> 
> The following program demonstrates the defect:
> 
> 
> public class FailingAnimationTimer extends Application {
>     @Override
>     public void start(Stage stage) throws Exception {
>         var button = new Button("start timer");
>         button.setOnAction(_ -> {
>             var timer = new AnimationTimer() {
>                 @Override
>                 public void handle(long l) {
>                     throw new RuntimeException("foo");
>                 }
>             };
> 
>             timer.start();
>         });
> 
>         var root = new HBox();
>         root.getChildren().add(new TextField("test"));
>         root.getChildren().add(button);
>         stage.setScene(new Scene(root));
>         stage.show();
>     }
> }
> 
> 
> The solution is to not allow user exceptions to bubble up into animation framework code. If an exception occurs, it is instead sent to the current thread's uncaught exception handler. This is the same thing that we already do for exceptions thrown by invalidation listeners and change listeners.
> 
> In addition to that, a failing animation timer has the potential to spam logs, which is why I introduced a cut-off value at 100 exceptions for each individual timer, after which no further exceptions from this particular timer are sent to the uncaught exception handler. After reaching the cut-off value, the following warning is logged:
> 
> `WARNING: Too many exceptions thrown by AnimationTimer, ignoring further exceptions. The cut-off number can be set with the system property com.sun.scenario.animation.failingTimerThreshold (current = 100).`

This pull request has now been integrated.

Changeset: 192b8613
Author:    Michael Strauß <mstrauss at openjdk.org>
URL:       https://git.openjdk.org/jfx/commit/192b86137d9a29c5c420434f8021f8dabd21dccf
Stats:     229 lines in 2 files changed: 205 ins; 4 del; 20 mod

8357157: Exception thrown from AnimationTimer freezes application

Reviewed-by: angorya, kizune

-------------

PR: https://git.openjdk.org/jfx/pull/1811


More information about the openjfx-dev mailing list