Why "Remove selected entries from this group" often generates error?
JabRef version
5.13 (latest release)
Operating system
Windows
Details on version and operating system
No response
Checked with the latest development build (copy version output from About dialog)
- [X] I made a backup of my libraries before testing the latest development version.
- [X] I have tested the latest development version and the problem persists
Steps to reproduce the behaviour
Steps to reproduce this error:
Operation (Remove selected entry from group 3):
Result:
As we can see, the selected entry was successfully removed, but the error occurs almost certainly every time this operation is executed.
Appendix
...
Log File
Paste an excerpt of your log file here
Can you please share the whole stack trace of the error message? I also recommend trying out the latest development version https://builds.jabref.org/main/
Thanks! I am using the latest development version https://builds.jabref.org/main/. The whole stack trace of the error message is:
arraycopy:length-1 is negative
The exception stacktrace was:
java.lang.ArrayIndexOutOfBoundsException: arraycopy: length -1 is negative
at java.base/java.lang.System.arraycopy(Native Method)
at [email protected]/javafx.collections.transformation.SortedList.updateUnsorted(Unknown Source)
at [email protected]/javafx.collections.transformation.SortedList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/javafx.collections.transformation.FilteredList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/com.tobiasdiez.easybind.MappedBackedList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/org.jabref.gui.util.UiThreadList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.FXCollections$UnmodifiableObservableListImpl.lambda$new$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.FXCollections$SynchronizedObservableList.lambda$new$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableListWrapper.access$200(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableListWrapper$1$1.invalidated(Unknown Source)
at [email protected]/com.sun.javafx.collections.MapListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.MapListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.callObservers(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.put(Unknown Source)
at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
at [email protected]/org.jabref.gui.entryeditor.SourceTab.storeSource(Unknown Source)
at [email protected]/org.jabref.gui.entryeditor.SourceTab.bindToEntry(Unknown Source)
at [email protected]/org.jabref.gui.entryeditor.EntryEditorTab.notifyAboutFocus(Unknown Source)
at [email protected]/org.jabref.gui.entryeditor.EntryEditor.setEntry(Unknown Source)
at [email protected]/org.jabref.gui.LibraryTab.lambda$createMainTable$11(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$0(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList._endChange(Unknown Source)
at [email protected]/javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList._endChange(Unknown Source)
at [email protected]/javafx.scene.control.ControlUtils.updateSelectedIndices(Unknown Source)
at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.fireCustomSelectedCellsListChangeEvent(Unknown Source)
at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.lambda$new$0(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/javafx.collections.transformation.SortedList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/javafx.collections.ModifiableObservableListBase.add(Unknown Source)
at java.base/java.util.AbstractList.add(Unknown Source)
at [email protected]/com.sun.javafx.scene.control.SelectedCellsMap.add(Unknown Source)
at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.select(Unknown Source)
at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.select(Unknown Source)
at [email protected]/javafx.scene.control.MultipleSelectionModelBase.shiftSelection(Unknown Source)
at [email protected]/javafx.scene.control.MultipleSelectionModelBase.shiftSelection(Unknown Source)
at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.updateSelection(Unknown Source)
at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.lambda$new$2(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.transformation.SortedList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/javafx.collections.transformation.FilteredList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/com.tobiasdiez.easybind.MappedBackedList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/org.jabref.gui.util.UiThreadList.sourceChanged(Unknown Source)
at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.FXCollections$UnmodifiableObservableListImpl.lambda$new$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.FXCollections$SynchronizedObservableList.lambda$new$0(Unknown Source)
at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableListWrapper.access$200(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableListWrapper$1$1.invalidated(Unknown Source)
at [email protected]/com.sun.javafx.collections.MapListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.MapListenerHelper.fireValueChangedEvent(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.callObservers(Unknown Source)
at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.put(Unknown Source)
at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
at [email protected]/org.jabref.model.groups.WordKeywordGroup.remove(Unknown Source)
at [email protected]/org.jabref.model.groups.GroupTreeNode.removeEntriesFromGroup(Unknown Source)
at [email protected]/org.jabref.gui.groups.GroupTreeViewModel.removeSelectedEntries(Unknown Source)
at [email protected]/org.jabref.gui.groups.GroupTreeView$ContextAction.execute(Unknown Source)
at [email protected]/org.jabref.gui.actions.JabRefAction.lambda$new$3(Unknown Source)
at [email protected]/org.controlsfx.control.action.Action.handle(Unknown Source)
at [email protected]/org.controlsfx.control.action.Action.handle(Unknown Source)
at [email protected]/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at [email protected]/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at [email protected]/javafx.event.Event.fireEvent(Unknown Source)
at [email protected]/javafx.scene.control.MenuItem.fire(Unknown Source)
at [email protected]/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.doSelect(Unknown Source)
at [email protected]/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.lambda$createChildren$12(Unknown Source)
at [email protected]/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at [email protected]/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at [email protected]/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at [email protected]/javafx.event.Event.fireEvent(Unknown Source)
at [email protected]/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at [email protected]/javafx.scene.Scene.processMouseEvent(Unknown Source)
at [email protected]/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at [email protected]/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at [email protected]/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at [email protected]/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at [email protected]/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at [email protected]/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
I have been looking into this for a bit since I got the exact same error on Linux today.
The culprit is in FilteredListProxy in Line 74.
In that line
System.arraycopy(filtered, pos + 1, filtered, pos, size - pos - 1);
both size and pos have the identical value, thus leading to arraycopy receiving invalid arguments.
But after testing for a bit I was not able to reproduce the error again so I can't really seem to find out why they are set equally.
Which leads me to believe this might be a race condition somehow that just doesn't update the values in time?
I'll test a bit more to see if I can trigger it again or if I find a consistent setup. If I identify the culprit I'll submit a PR.
I'll test a bit more to see if I can trigger it again or if I find a consistent setup. If I identify the culprit I'll submit a PR.
Maybe a bit of an update: This issue can be closed because, for all I can see, it's solved. The version I ran was in fact 5.15 but since you guys redesigned a lot of the repo a lot of things have changed. Including this specific behavior that causes this bug. The file I am referring to was only added in db9f83c (about two months after this issue was opened).
And after a bit of testing I have concluded: In the newest version on the main branch it is not possible to produce this bug.
Maybe a bit of an explanation why:
Through a bit of experimentation I found that if you increase size, arraycopy doesn't trigger the bug, because it obviously doesn't find the index to remove in the table-list - it just glitches out the source list but that's it.
Only if you increment the pos variable can you somehow trigger this.
But since pos is literally the result of a binary search which can at max be size - 1, it is guaranteed that pos < size.
So it is literally not possible to have a behavior where arraycopy is called in this particular instance with a negative value.
Hope I was at least able to help close this issue. If anything, it was fun diving into your codebase. :)
@JamarleyHub thanks so much for your analysis! Feel free to tackle any of the other bugs 😉