2026-03-18 12:38:34 [pool-2-thread-4] org.jabref.logic.util.FallbackExceptionHandler.uncaughtException()
ERROR: Uncaught exception occurred in Thread[#69,pool-2-thread-4,5,main]: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = pool-2-thread-4
at javafx.graphics@25.0.2/com.sun.glass.ui.Application.checkEventThread(Application.java:442)
at javafx.graphics@25.0.2/com.sun.glass.ui.MenuItem.setEnabled(MenuItem.java:108)
at javafx.graphics@25.0.2/com.sun.javafx.tk.quantum.GlassSystemMenu.lambda$insertMenuItem$2(GlassSystemMenu.java:289)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:376)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:104)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:376)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:104)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:104)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:78)
at javafx.base@25.0.2/javafx.beans.property.ReadOnlyBooleanWrapper.fireValueChangedEvent(ReadOnlyBooleanWrapper.java:103)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
at javafx.base@25.0.2/javafx.beans.binding.Bindings$ShortCircuitAndInvalidator.invalidated(Bindings.java:4669)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.binding.ObjectBinding.invalidate(ObjectBinding.java:192)
at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:376)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.binding.ObjectBinding.invalidate(ObjectBinding.java:192)
at com.tobiasdiez.easybind@2.3.0/com.tobiasdiez.easybind.FlatMapBindingBase.mappedInvalidated(FlatMap.java:72)
at com.tobiasdiez.easybind@2.3.0/com.tobiasdiez.easybind.FlatMapBindingBase.lambda$new$1(FlatMap.java:22)
at javafx.base@25.0.2/javafx.beans.WeakInvalidationListener.invalidated(WeakInvalidationListener.java:82)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
at javafx.base@25.0.2/com.sun.javafx.collections.MapListenerHelper$Generic.fireValueChangedEvent(MapListenerHelper.java:318)
at javafx.base@25.0.2/com.sun.javafx.collections.MapListenerHelper.fireValueChangedEvent(MapListenerHelper.java:70)
at javafx.base@25.0.2/com.sun.javafx.collections.ObservableMapWrapper.callObservers(ObservableMapWrapper.java:115)
at javafx.base@25.0.2/com.sun.javafx.collections.ObservableMapWrapper.put(ObservableMapWrapper.java:169)
at org.jabref.jablib/org.jabref.model.entry.BibEntry.setField(BibEntry.java:592)
at org.jabref.jablib/org.jabref.logic.cleanup.FieldFormatterCleanup.cleanupSingleField(FieldFormatterCleanup.java:62)
at org.jabref.jablib/org.jabref.logic.cleanup.FieldFormatterCleanup.cleanup(FieldFormatterCleanup.java:35)
at org.jabref.jablib/org.jabref.logic.cleanup.CleanupWorker.cleanup(CleanupWorker.java:44)
at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel.doCleanup(CleanupDialogViewModel.java:170)
at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel.cleanupWithProgress(CleanupDialogViewModel.java:231)
at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel$1.call(CleanupDialogViewModel.java:136)
at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel$1.call(CleanupDialogViewModel.java:133)
at org.jabref/org.jabref.gui.util.UiTaskExecutor$1.call(UiTaskExecutor.java:175)
at javafx.graphics@25.0.2/javafx.concurrent.Task$TaskCallable.call(Task.java:1407)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base/java.lang.Thread.run(Thread.java:1474)
JabRef version
Latest development branch build (please note build date below)
Operating system
macOS
Details on version and operating system
macOS Tahoe Version 26.2
Checked with the latest development build (copy version output from About dialog)
Steps to reproduce the behaviour
Quality -> Clean up entries.Here is the error message.
ERROR:
Uncaught exception occurred in Thread[#69,pool-2-thread-4,5,main]: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = pool-2-tNote: using the cleanup icon in the left sidebar (with title "Article") for the entry works correctly on my side. The issue only occurs when running
Quality -> Clean up entries.This may be related to #11966, which was similar but closed.
Appendix
...
Log File