2013-05-25 12 views
6

Ho una stringa in una pila, come ad esempio "a alexei.ATable $ IndexOfATable.access $ 1400 (ATable.java:80)"

E sono interessanti, quello che è il numero 1400? La classe interna IndexOfATable ha solo 3 campi, non 1400.

Intresting, perché il numero 1400 è così grande?

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' è solo una parte di un identificatore particolare - gli identificatori con' $ 'in essi sono * normalmente * generati da un compilatore/strumento (comprese le classi anonime in javac). Non ha bisogno di riguardare un indice o una dimensione. Vedi [questa risposta] (http://stackoverflow.com/a/4636669/2246674) per cosa significa "normalmente". – user2246674

+0

Ho capito, sono numerati dal passo 100: accedere a $ 000, accedere a $ 100, accedere a $ 200 e così via – Dumas45

risposta

15

È un metodo sintetico che il compilatore genera per gestire la classe interna. Il bytecode Java non ha il concetto di una classe interna, quindi quando è compilato esegue vari trucchi per "falsificare" la presenza di uno in fase di runtime. In questo caso particolare, la classe di metodi access$XXX è generalmente associata a fornire un riferimento alla classe esterna da quella interna. Tali entità sintetiche sono segni di questo. (Di solito è possibile individuarli per la presenza di un dollaro nel nome della classe/metodo.)

Perché il numero 1400 è così grande?

E 'un identificatore puramente arbitraria che solo il compilatore ha bisogno di conoscere (e sceglie quindi.) Fino a quando è unico all'interno dell'applicazione, potrebbe essere qualsiasi cosa (tecnicamente parlando, non hanno nemmeno bisogno di essere un numero.)

Per quanto riguarda dove si trova il problema, dare un'occhiata alla linea data dalla traccia più in cima allo stack: ATable.java:181.