2012-03-27 5 views
0

Mein Programm stürzt wegen einer Null-Zeiger-Ausnahme ab.Klassen-Deklaration verursacht Null-Zeiger-Ausnahme

Snip von Stack-Trace:

java.lang.NullPointerException 
at com.my.GRTRecTimeSortComparator.compare(SourceFile:15) 

, die gut und gut ist. Aber mein Problem ist, dass die Leitung 15 ist die Klassendeklaration:

15 public class GRTRecTimeSortComparator implements Comparator<GRTRecord> { 
16 @Override 
17 public int compare(GRTRecord rec1, GRTRecord rec2) { 
18  
19  int returnVal=rec1.getRecordCalendar().compareTo(rec2.getRecordCalendar()); 
20  return returnVal; 
21 } 
22} 

Es ist die Funktion Vergleich rufen, aber ich sehe nicht ein Problem mit, dass entweder. Jedem Datensatz ist ein eindeutiger Kalender zugewiesen.

Irgendwelche Ideen? Was habe ich hier falsch gemacht?

Edit: als Antwort auf Anfragen:

Nein, es ist nichts Ungewöhnliches über die Klasse selbst, andere als die Tatsache, dass ich es schrieb.

Ich benutze Proguard. Vielleicht ersetzt die Verschleierung die Dinge falsch?

Ich schreibe gerade Tests für die Aufzeichnungen. Sie sollten nicht null sein, noch sollte die Calendars; Ich benutze sie unmittelbar vorher und bekomme gute Ergebnisse.

Vielleicht passiere ich gerade die ArrayList falsch.

EDIT 2:

Logging Linien in die Klasse eingefügt nie laufen bekommen. Egal, was ich der Klasse hinzufüge oder tue, der Null-Zeiger wird immer in die Klassendeklarationszeile aufgelöst.

Entfernt Proguard Obfuscation, und immer noch keine Würfel.

Ich bin wirklich frustriert.

bearbeiten 3:

für zukünftige Benutzer:

Proguard ruiniert Ihr Stack-Trace. Das war die Ursache für das Oben. Entfernen Sie das Programm, wenn Probleme auftreten.

Die Ursache war tatsächlich ein beschädigter Datensatz im Dataset.

+4

Wahrscheinlich ist die Quelle, aus der Sie lesen, nicht synchron mit dem Stack-Trace in Ihrem kompilierten Code. Versuchen Sie, von Clean zu erstellen und dann erneut auszuführen. –

Antwort

1

Ich vermute stark, dass die Debug-Informationen gerade nicht synchron sind. Loggen Sie sich in Ihre compare Methode ein. Ich würde log (in Reihenfolge):

  • rec1
  • rec2
  • rec1.getRecordCalendar()
  • rec2.getRecordCalendar()

Wenn dies nicht das Problem ist, gibt es etwas "seltsam" über die Klasse auf andere Weise?Zum Beispiel:

  • Verwenden Sie Hibernate oder etwas ähnliches, die möglicherweise Proxies für Sie erstellen?
  • Ist das eine innere Klasse?
+0

Kein Hibernate. Ich glaube nicht, dass es etwas Außergewöhnliches gibt, außer Proguard zu benutzen. Dies ist alles innerhalb einer Netbeans Paltform Application, die in einem der SwingWorker auftritt. – Sheriff

+0

@Sheriff: Und haben Sie die Protokollierung vorgeschlagen, die ich vorgeschlagen habe? Ich wäre überhaupt nicht überrascht, wenn Proguard mit den Stack-Spuren herumspielen würde. –

+0

Ich habe die Protokollierung eingegeben. Es wurde jedoch nie ausgeführt. Ich habe Proguard deaktiviert, und das verschiebt den Stack-Trace-Fehler wie erwartet auf die Compare-Funktion. Erneutes Aktivieren der Protokollierung, um zu sehen, was jetzt passiert. – Sheriff

1

In Zeiten wie diesen ist es gut, den Debugger auf einen Fehler zu setzen. Sie werden genau wissen, wo Ihre NPE ist.

+0

Ich denke, das ist Zeit für mich zu lernen, wie man den Debugger wirklich benutzt. – Sheriff

1

Sie möchten vielleicht die Überprüfung für eine Null-rec1 und rec2 auf Vollständigkeit versuchen

+0

Keine sind null. Die 'ArrayList' enthält 127996 Datensätze, alle mit guten' Calendar' Objekten. – Sheriff

0

Wenn Sie Sie Komparator-Schnittstelle dann implementieren nur compare() Methode verwenden können, aber Sie versuchen, compareTo() Verfahren vergleichbarer zuzugreifen, die Sie didn nicht implementieren. In Ihrem Programm:

Der Vergleichswert wird in Form eines Referenzformulars zurückgegeben, das nicht zu einem primitiven Typ zurückkehren konnte.

0

ProGuard versucht, Debugging-Informationen so gut wie möglich zu erhalten, aber das ist nicht immer technisch möglich. Wenn zum Beispiel die Methode getRecordCalendar inline wird, werden alle Ausnahmen, die die Methode auslöst, jetzt von der Aufruf-Site geworfen.