8

「at alexei.ATable$IndexOfATable.access$1400(ATable.java:80)」などのスタックに文字列があります。

興味深いことに、1400 という数字は何ですか? 内部クラス IndexOfATable には、1400 ではなく、3 つのフィールドしかありません。

興味深いことに、なぜ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 に答える