8

我在堆栈中有一个字符串,例如“at alexei.ATable$IndexOfATable.access$1400(ATable.java:80)”

我很有趣,1400这个数字是多少?内部类 IndexOfATable 只有 3 个字段,不是 1400 个。

有意思,为什么1400这个数字这么大?

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
4

1 回答 1

22

它是编译器为处理内部类而生成的一种合成方法。Java 字节码没有内部类的概念,所以当它被编译时,它会执行各种技巧来“假”在运行时存在一个。在这种特殊情况下,access$XXX方法类通常与从内部类提供对外部类的引用相关联。这种合成实体就是这方面的标志。(您通常可以通过类/方法名称中的美元来发现它们。)

为什么1400这个数字这么大?

它是一个纯粹的任意标识符,只有编译器需要知道(并因此选择。)只要它在应用程序中是唯一的,它可以是任何东西(从技术上讲,它甚至不必是数字。)

至于问题出在哪里,请查看最顶层堆栈跟踪给出的行:ATable.java:181.

于 2013-05-25T08:06:22.553 回答