2

ブレークポイントをオンラインに設定できないのはなぜString a;ですか?

public void localMethod() {
    String a;
    a = "haha";
    System.out.println(a);
}

ローカル変数は、明示的に値を割り当てるまで初期化されないことを知っています。しかし、それはコード行であり、何かを行います。なぜ私はそこで止まらないのですか?ブレークポイントに適しているのはどの行ですか?

私はEclipse、jdk6_31を使用しています

4

4 に答える 4

4

宣言自体は実際には実行可能なコードではなく、何かの存在を宣言しているだけです。実際に何かを行う2行目にブレークポイントを配置できるはずです。

確かに、IDE が実行可能でない行にブレークポイントを追加するという概念をサポートすべきではない理由はわかりません。おそらく、実行環境内の実行可能ポイントにブレークポイントを実際にインストールする必要があるでしょう...

編集:私が何を意味するかを明確にするために、このコード:

public void foo() {
    String a;
    String b;
    a = "hello";
    b = " world";
    System.out.println(a + b);        
}

以下と同じバイトコードにコンパイルされます。

public void foo() {
    String a;
    a = "hello";
    String b;
    b = " world";
    System.out.println(a + b);        
}

宣言のためにコードを実行する必要はありません。その時点でスペースを予約することはありません。コンパイラはメソッドのスタック空間内に「スロット」を割り当て、メソッド全体でそのスロットを使用しますが、変数がループ内で宣言されている場合でも、追加の初期化なしで同じスロットを再利用できます。

于 2012-04-26T15:06:17.577 に答える
4

ブレークポイントは、実行中の特定の行を監視する IDE/コンパイラによって生成されます。これらは、バイトコードの行番号で表されます。変数の宣言と初期化を表すバイトコードは、コンパイル中に 1 つのステップに結合されます。したがって、変数の宣言が割り当てから分割されている場合、生成されたバイトコードで使用できるブレーク ポイントはありません。

あなたの例のバイトコードは次のとおりです。

public class Example {
    public void localMethod() {
        String a;
        a = "haha";
        System.out.println(a);
    }
}

に:

public class stackoverflow/Example {

  // compiled from: Example.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 6 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lstackoverflow/Example; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public localMethod()V
   L0
    LINENUMBER 9 L0
    LDC "haha"
    ASTORE 1
   L1
    LINENUMBER 10 L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L2
    LINENUMBER 11 L2
    RETURN
   L3
    LOCALVARIABLE this Lstackoverflow/Example; L0 L3 0
    LOCALVARIABLE a Ljava/lang/String; L1 L3 1
    MAXSTACK = 2
    MAXLOCALS = 2
}

String a私の IDE では宣言を表す 8 行目に LINENUMBER タグがないことに注意してください。

于 2012-04-26T15:07:14.113 に答える
1

ローカル変数の宣言に対応するバイトコードがaないため、宣言時にブレークポイントを設定することはできず、初期化時にのみ設定できます。

サンプル.java:

class Sample {
public void localMethod() {
    String a;
    a = "haha";
    System.out.println(a);
}
}

javac Sample.java; javap -c サンプル

class Sample extends java.lang.Object{
Sample();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public void localMethod();
  Code:
   0:   ldc #2; //String haha
   2:   astore_1
   3:   getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   6:   aload_1
   7:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   10:  return

}
于 2012-04-26T15:12:16.727 に答える
0

ブレークポイントを使用すると、ユーザーは特定の場所でプログラムの実行を一時停止できます。通常、ブレークポイントはソース コードとともに UI に表示されます。プログラムの実行中にブレークポイントが検出されると、プログラムは一時停止し、理由として BREAKPOINT で SUSPEND デバッグ イベントをトリガーします。今..コンパイルすると..宣言と割り当ては単一のステップになります..最初に宣言され、次に値が割り当てられます..最後のステップは割り当てです..したがって、割り当てにブレークポイントを設定できますが、設定できません宣言について。

于 2012-04-26T15:13:36.217 に答える