2013-10-21 6 views
6

私はのIntelliJアイデアでJavaアプリをデバッグするとき、私はこのようなスタックフレーム内のすべての変数を参照してください。後に番号を何スタックフレームに変数のために示されているものの情報Javaアプリケーションのデバッグ中

object={[email protected]} 

」 @ "という意味ですか?これは、hashCodeが返すものとは異なります。 hashCodeは、整数表現で705908426に等しい16進表現の数値2a134ecaを返します。番号77と705908426は区別されます。

+1

Opps ..ここでこれを行うつもりだった...オブジェクトが作成されたときの割り当てカウント番号のように見えます。たくさんのオブジェクトを作成すると、それらが順次インクリメントされることがわかります。これは、スレッドごと、またはデバッグ実行ごとに行うことができますが、わかりません。私はまだこの文書を見つけることができませんでした...。 – RickHigh

答えて

6

@は、オブジェクトのカウント数は次のとおりです。つまり、このメソッドは、の値に 等しい文字列を返します。したがって、@ 1012は、アプリケーションの開始以降に作成された1012番目のオブジェクトを意味します。

IDハッシュコードではありません。ここで

は、いくつかの証拠である:(私は実際には知らないが、私はそれを観察するので、私はこれを言う)

public static void main(String [] args) throws Throwable { 

    Object object = new Object(); 
    Object object1 = new Object(); 
    Integer foo = new Integer(5); 
    Object object2 = new Object(); 
    String str = new String("bar"); 

    System.out.println("code :" + System.identityHashCode(object)); 

    RuntimeException exception = new RuntimeException(); 
    exception.printStackTrace(); //put breakpoint here 


} 

出力: コード:789451787 コード:[email protected] IntelliJのデバッガから

789451787 = 2f0e140bところで...

は出力:

static = org.boon.core.MyClass 
args = {java.lang.String[0]@**97**} 
object = {[email protected]**98**} 
object1 = {[email protected]**99**} 
foo = {[email protected]**100**}"5" 
object2 = {[email protected]**101**} 
str = {[email protected]**102**}"bar" 
exception = {[email protected]**103**}"java.lang.RuntimeException" 

私は経験的にこのことを知っているが、私は、実際の実装を知らないが、私はそれがこのような問題に関連していると思う:

as3: meaningful object identification while debugging

-1

クラスオブジェクトの後にそのメモリアドレスが続きます。

In {[email protected]}: 
Class name: java.lang.Object 
Memory Address: 77ddeeff 

だからこの大会名@アドレスは、のように私たちの電子メールアドレスのようなものです([email protected])ABCは位置しています@ gmail.com "@" の後に番号を何

+0

申し訳ありませんが、Sun独自のJVMとOpenJDKは、通常、ハッシュコードを割り当てる際にメモリアドレスを使用しません。 – afk5min

+0

プログラムを作成しましたが、IntelliJはIDハッシュコードを使用していません。 [email protected]!= [email protected] – RickHigh

2

平均?

@

デバッガは、その値を表示するオブジェクトのtoString方法を使用するだけのセパレータです。そして、ここjavadocsからtoString方法のデフォルトの実装の説明である:

クラスオブジェクトのtoStringメソッド の目的は、AT-SIGN、インスタンスであるクラス名からなる文字列を返す 文字 '@'、およびオブジェクトのハッシュ コードの符号なし16進表現です。アプリが起動してから

getClass().getName() + '@' + Integer.toHexString(hashCode()) 
+0

申し訳ありませんが、私はまだ理解しません。デフォルトでは、hashCodeは、このオブジェクトが存在するメモリアドレスの整数表現を返すことになっています。しかしIntellij Ideaで私のアプリをデバッグしている間は、スタックフレーム内の変数は[email protected]のように表示されますが、toStringメソッドは[email protected]を返します。これはclassnameとhashCodeが@で区切られています。番号72と2a134ecaは区別されます。それで72はどういう意味ですか? – user1745356

+0

オブジェクトが作成されたときの割り当てカウント番号のように見えます。たくさんのオブジェクトを作成すると、それらが順次インクリメントされることがわかります。これは、スレッドごと、またはデバッグ実行ごとに行うことができますが、わかりません。私はまだこの文書を見つけることができませんでした...。 – RickHigh

関連する問題