Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NPE bei der Sortierung von Regionen #499

Closed
hjbflyer opened this issue Apr 27, 2016 · 5 comments
Closed

NPE bei der Sortierung von Regionen #499

hjbflyer opened this issue Apr 27, 2016 · 5 comments
Labels

Comments

@hjbflyer
Copy link
Contributor

Das Statement
if (option == 100)
verursacht eine NPE. Da ich nicht verstehe was option == 100 bedeutet, habe ich die die Abfrage
'option != null' noch nicht hinzugefügt. Der Fehler passiert beim Sortieren nach Regionen (Ebene 2)

!ENTRY org.eclipse.e4.ui.workbench 4 0 2016-04-27 19:16:04.450
!MESSAGE Internal Error
!STACK 0
java.lang.NullPointerException
    at name.abuchen.portfolio.ui.views.columns.TaxonomyColumn$TaxonomyLabelProvider.getText(TaxonomyColumn.java:125)
    at name.abuchen.portfolio.ui.views.columns.TaxonomyColumn$TaxonomyComparator.compare(TaxonomyColumn.java:165)
    at name.abuchen.portfolio.ui.views.columns.TaxonomyColumn$TaxonomyComparator.compare(TaxonomyColumn.java:1)
    at name.abuchen.portfolio.ui.util.viewers.ColumnViewerSorter$OptionAwareComparator.compare(ColumnViewerSorter.java:49)
    at name.abuchen.portfolio.ui.views.StatementOfAssetsViewer$ElementComparator.compare(StatementOfAssetsViewer.java:1027)
    at name.abuchen.portfolio.ui.util.viewers.ColumnViewerSorter$X.compare(ColumnViewerSorter.java:308)
    at org.eclipse.jface.viewers.ViewerComparator$1.compare(ViewerComparator.java:192)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)
    at java.util.TimSort.sort(TimSort.java:234)
    at java.util.Arrays.sort(Arrays.java:1438)
    at org.eclipse.jface.viewers.ViewerComparator.sort(ViewerComparator.java:189)
    at org.eclipse.jface.viewers.StructuredViewer.getSortedChildren(StructuredViewer.java:1087)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefreshAll(AbstractTableViewer.java:667)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefresh(AbstractTableViewer.java:615)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefresh(AbstractTableViewer.java:607)
    at org.eclipse.jface.viewers.StructuredViewer$7.run(StructuredViewer.java:1526)
    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1462)
    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1423)
    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1523)
    at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:522)
    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1482)
    at org.eclipse.jface.viewers.StructuredViewer.setComparator(StructuredViewer.java:1816)
    at name.abuchen.portfolio.ui.util.viewers.ColumnViewerSorter$X.setSorter(ColumnViewerSorter.java:293)
    at name.abuchen.portfolio.ui.util.viewers.ColumnViewerSorter$X.handleSelectionEvent(ColumnViewerSorter.java:270)
    at name.abuchen.portfolio.ui.util.viewers.ColumnViewerSorter$X.lambda$0(ColumnViewerSorter.java:243)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4230)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1491)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1514)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1499)
    at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1299)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4072)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3698)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1127)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1018)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
    at org.eclipse.e4.ui.internal.workbench.swt.E4Application.start(E4Application.java:159)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
    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:497)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:669)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:608)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1515)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1488)
@buchen buchen added the bug label Apr 28, 2016
@buchen
Copy link
Owner

buchen commented Apr 28, 2016

option == 100

heißt die gesamte Klassifikation (also der gesamte Pfad) wird ausgegeben.

Außerdem wollte ich die Klasse ja auch noch umbenennen ColumnViewerSorter$X. ts ts ts. Schaue ich mir an.

@hjbflyer
Copy link
Contributor Author

Dies ist aus meiner Sicht auch ein Schönes Beispiel dafür dass man für den Wert 100 besser eine Konstante definiert, deren Name dann besser beschreibt, was der Wert bedeuten soll.
Ein weiterer Vorteil wäre natürliche eine bessere nachträgliche Änderbarkeit.

@buchen
Copy link
Owner

buchen commented Apr 30, 2016

Die Verwendung von 100 statt einer Konstanten ist natürlich unschön. Habe ich geändert.

Der Grund für die NPE ist mir jetzt klar. Um einige Spalten zu sortieren brauche ich mehr Informationen - zum Beispiel die Original "Sortierrichtung" oder die Option - siehe hier im ColumnViewerSorter. Bei der TaxonomyColumn in der Vermögensaufstellung wird jetzt beides gebraucht - der Fall ist momentan noch nicht abgedeckt. Hier fehlt mir jetzt noch das richtige Pattern. Klar, man könnte jetzt ein weitere Interface definieren ("sortieren mit direction und option"). Oder mit ThreadLocal arbeiten? Das macht es aber sehr indirekt. Ich bin jetzt gleich auf Achse. Also vielleicht morgen. Wenn Dir was einfällt - gerne! 😄

@hjbflyer
Copy link
Contributor Author

Ich habe noch eine Frage zur Lesbarkeit. Worin unterscheiden sich die Integer-Objekte element und option? Sie sind doch beide der Index in die Taxonomie oder SHOW_FULL_CLASSIFICATION?

@buchen
Copy link
Owner

buchen commented May 1, 2016

Worin unterscheiden sich die Integer-Objekte element und option?

Das ist in der Tat verwirrend. Es kommt daher, dass ich im Options interface die einzelnen Optionen elements genannt habe (vermutlich gefiel mir damals ein Options#getOptions nicht...

Das sollte ich bei Gelegenheit gerade ziehen: element ist immer eine Zeile im Viewer, option ein Parametrisierung der Spalte die je nach Spalte andere Typen haben kann (bei der Taxonomy eben Integer).

buchen added a commit that referenced this issue May 1, 2016
When sorting the taxonomy column, the comparators need both access to
the sort direction (keep categories stable) and the option (sort the
taxonomy column according to selected classification). Instead of
interfaces (which supported only one of each) all comparators have now
access via the SortingContext.

Issue: #499
Signed-off-by: Andreas Buchen <andreas.buchen@gmail.com>
@buchen buchen closed this as completed May 1, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants