3

「コード」と呼ばれる文字列が読み取れないようです。それはなぜですか、どうすれば修正できますか?

私のコード(問題を引き起こすスニペット):

String code;
for(int z = 0; z<x;z= z+0) // Repeat once for every character in the input string remaining
{
    for(int y=0;y<2;y++) //Repeat twice
    {
        c = (char)(r.nextInt(26) + 'a'); //Generate a random character (lowercase)
        ca = Character.toString(c);
        temp = code;
        code = temp + ca; //Add a random character to the encoded string
    }

私のエラーレポート:

--------------------Configuration: <Default>--------------------
H:\Java\Compiler.java:66: variable code might not have been initialized
        temp = code;
               ^
1 error

Process completed.

(私はJCreator 5.00、Java 7を使用しています。)

(はい、エラーレポートはばかげているように見えますが、Stack Overflowはそれをコーディングとして読み取ります。)

4

3 に答える 3

7

ゼロのcode場合、どのような値になりますか?x答えは、まったく価値がない(さえnull)ということです。必要に応じて、空の文字列に初期化することもできます。

String code = "";
于 2012-05-20T22:38:36.303 に答える
4

Java では、値を使用する前にすべての変数を初期化する必要があります。この例では、変数が割り当てられる前に使用されているというかなり明白なケースがあります。Java 言語仕様 (JLS) ではこれが許可されていません。(そうすると、プログラムの動作は予測不能になり、... 潜在的に ... JVM がクラッシュします。)

他の場合では、問題の変数が実際には常に初期化されている場合 (またはそのように見える場合) に、コンパイラーがエラーを出します。コードを「理解」したり、初期化の論理的証明を導き出そうとしたりするのではなく、コンパイラは指定された手順に従って、変数が確実に割り当てられているかどうかを判断します。この手順は本質的に保守的であり、「初期化されている」または「初期化されていない可能性がある」という答えが返されます。したがって、コンパイル エラー メッセージの文言です。

以下は、変数が使用前に初期化されていることが「明らか」であるにもかかわらず、コンパイラがエラーを出す例です。

boolean panic;
for (int i = 0; i < 10; i += 2) {
    if (i % 2 == 1 && panic) { // compilation error here
        System.out.println("Panic!!");
    }
}

明確な代入規則 (JLS で指定) は、panic示された時点で確実に初期化されていないと述べています。形式メソッドの基本を理解している人にとって、i % 2 == 1が常に であることを証明するのは簡単なことfalseです。ただし、コンパイラはできません。(たとえそれができたとしても、JLS 規則を考えると、コードはまだエラーになっています。)

于 2012-05-20T22:52:26.417 に答える
2

参照を作成しましたが、初期化していません。code最初の行を次のように変更して初期化します

String code = ""

編集: Zavior は、新しい文字列にスペースを割り当てるのではなく、キャッシュから初期化された文字列を取得できることを指摘しました。

しかし、なぜ temp を code に割り当ててから、 code を temp と何か他のものに割り当てているのでしょうか? に設定できますcode = code + ca

于 2012-05-20T22:39:19.500 に答える