この場合、設定後に foo 変数を使用しないため、JVM が変数を完全に無視することは合法です。変数は決して使用されず、プログラムの結果は変わらないからです。
ただし、デバッグ モードでは起こりそうにありません。
あなたの場合、 foo は、スコープ内にあるか、try/catch ブロックの後のセクションを含む参照を保持している限り、GC されるべきではありません。
編集
実際、Java 7.0_03を使用したNetbeans 7.1.1で説明したのと同じ動作が得られます...
問題の 1 つは、デフォルト値を に設定していないためfoo
、try/catch ブロックの後で使用できないことです (コンパイルされません)。
バイトコード
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String bar
2: astore_1
3: iconst_5
4: istore_2
5: goto 9
8: astore_2
9: iconst_3
10: istore_2
11: return
- 最初のステートメントとして使用
String foo = null;
します。この場合、デバッガーは try/catch ブロックの後に値を確認します。
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: astore_1
2: ldc #2 // String bar
4: astore_1
5: iconst_5
6: istore_2
7: goto 11
10: astore_2
11: iconst_3
12: istore_2
13: return
私はバイトコードの専門家ではありませんが、私と非常によく似ています...
結論
私の個人的な結論は、デバッガーが の値を表示するには、何らかの種類foo
の a を実行する必要があるということです。これは、初期化されていない可能性があるため、catch ブロックの後に有効なステートメントではありません。そのセクションにa を追加することは正しくありません (コンパイルされません)。デバッガーは、値が何であり、何を示しているかについて少し迷っています。foo.toString()
foo
System.out.println(foo)
null
これが GC とは何の関係もないことを納得させるために、次の例を試すことができます。
public static void main(String[] args){
String foo;
char[] c = null;
try {
foo = "bar";
c = foo.toCharArray();
int yoo = 5; //1
} catch (Exception e) {
}
int foobar = 3;//2
}
行では、それが成り立つのfoobar
を見ることができますが、 foo は と表示されます。したがって、文字列はまだ存在しますが、デバッガーはそれを表示できません。c
bar
null
さらに面白い例:
public static void main(String[] args){
String foo;
List<String> list = new ArrayList<String>();
try {
foo = "bar";
list.add(foo);
int yoo = 5; //1
} catch (Exception e) {
}
int foobar = 3;//2
}
foobar
行では、とfoo
表示されますnull
が、list
含まれているのは"bar"
... いいね。