2

Javaコンパイラがfinallyブロックで「ローカル変数が初期化されていない可能性があります」と表示されるのはなぜですか。どのコードフローが初期化されていないかわかりません。

 public static void test() {
    String s;
    try {
        s = "abc";
    } catch (Throwable e) {
        s = "throwable";
    } finally {
        System.out.println(s.getClass()); //---->(The local variable s may not have been initialized)
    }
}
4

5 に答える 5

4

Java言語仕様の一部は、ローカル変数を使用する前に(つまり、その値が参照される前に)明示的に初期化する必要があることです。

価値が与えられるのThrowablesを妨げるものがあります-それらの1つです。sOutOFMemoryError

sを指定すると、コンパイルの問題が修正されます。

String s = null;

明示的な初期化が必要な理由は、ローカル変数がインスタンス変数のようにヒープメモリではなくスタックメモリを使用し、変数にデフォルト値を与える構築フェーズがないためです。コード化する必要があります。

于 2012-11-09T13:08:16.747 に答える
3

6行目にOutOfMemory-Errorがある場合、8行目ではsを使用できません。

于 2012-11-09T13:09:50.143 に答える
1

基本的に、sが初期化される前に、catchブロックに新しい例外が発生する可能性があります。たとえば、OutOfMemoryErrorです。

于 2012-11-09T13:12:13.307 に答える
1

これは、コンパイラが、ブロック内の割り当てがtry問題なく、ブロックと同様に実行されることを100%保証できないためcatchです。また、両方の割り当てが失敗しsた場合でも、finally合法ではないブロックに出力されたときに初期化されません。

于 2012-11-09T13:09:06.617 に答える
1

どのコードフローが初期化されていないのかわかりません。

理論的には、try/catchたとえば、ブロックで例外が発生する可能性がありますOutOfMemoryExceptionsこれを避けるために、次のように初期化できますnull

String s = null;
于 2012-11-09T13:09:33.653 に答える