2013-05-25 6 views
6

Ich habe einen String in einem Stapel, wie "bei alexei.ATable $ IndexOfATable.access $ 1400 (ATable.java:80)" bekam

Und ich bin interessant, was die Zahl 1400 ist? Innere Klasse IndexOfATable hat nur 3 Felder, nicht 1400.

Intresting, Warum die Zahl 1400 ist so groß?

debug: 
Exception in thread "main" java.lang.NullPointerException 
    at alexei.ATable$IndexOfATable.compareTwoRows(ATable.java:181) 
    at alexei.ATable$IndexOfATable.access$1400(ATable.java:80) 
    at alexei.ATable.updateIndex(ATable.java:501) 
    at alexei.ATable.addRow(ATable.java:361) 
    at learn.Base.main(Base.java:18) 
Java Result: 1 
+1

'.. $ 1400' ist nur Teil eines bestimmten Bezeichners - Bezeichner mit' $ 'in ihnen werden * normalerweise * von einem Compiler/Tool generiert (einschließlich anonymer Klassen in javac). Es muss sich nicht auf einen Index oder eine Größe beziehen. Siehe [diese Antwort] (http://stackoverflow.com/a/4636669/2246674) für was "normalerweise" bedeutet. – user2246674

+0

Ich habe festgestellt, sie nummeriert von Schritt 100: Zugang $ 000, Zugriff auf $ 100, Zugriff auf $ 200 und so weiter – Dumas45

Antwort

15

Es ist eine synthetische Methode, die der Compiler generiert, um mit der inneren Klasse umzugehen. Der Java-Bytecode hat nicht das Konzept einer inneren Klasse. Wenn er kompiliert wird, führt er verschiedene Tricks aus, um die Anwesenheit eines Objekts zur Laufzeit zu "fälschen". In diesem speziellen Fall ist die access$XXX Klasse von Methoden im Allgemeinen mit der Bereitstellung einer Referenz auf die äußere Klasse von der inneren verbunden. Solche synthetischen Entitäten sind Anzeichen dafür. (Sie können sie normalerweise durch das Vorhandensein eines Dollars im Klassen-/Methodennamen erkennen.)

Warum ist die Zahl 1400 so groß?

Es ist eine rein willkürliche Kennung, die nur der Compiler darüber wissen muss (und damit wählt.) Solange es innerhalb der Anwendung eindeutig ist, es könnte alles sein (technisch gesprochen, es muss nicht einmal sein eine Nummer.)

Wo das Problem liegt, sehen Sie sich die Zeile an, die von der obersten Stapelspur angegeben wird: ATable.java:181.