4

理解できないコンパイラ警告が表示されます:

procedure Test;
var
  Var1: Integer;
begin
    while True do
    begin
        try
            if System.Random > 0.5 then
            begin
                ShowMessage('Skipping');
                continue; // If I remove this line, the warning goes away
            end;
            Var1:=6;
        except on
            E:Exception do
            begin
                ShowMessage('Error');
                raise;
            end;
        end;
        ShowMessage(IntToStr(Var1)); // Compiler warning on this line
    end;
end;

これを Delphi 2010 でコンパイルすると、次のようになります。

[DCC 警告] OnlineClaimManagerMainU.pas(554): W1036 変数 'Var1' が初期化されていない可能性があります

「続行」の呼び出しを削除すると、警告が消えます。

また、try/except 句を削除すると (そして continue を残すと)、警告は消えます。

Var1 を初期化せずに、どのようにして問題の行に到達するのでしょうか?

4

3 に答える 3

4

Var1使用する前に常に初期化されます。コンパイラーは混乱しますtry-処理: コードが複雑すぎて、コンパイラーが常に初期化exceptされていると実際に判断できません。Var1の前に処理された例外があり、初期化されていないVar1:=6;ままになる可能性があることVar1がわかりますが、その例外が常に再発生することはわかりません。

于 2012-07-19T06:13:56.643 に答える
0

ShowMessage(IntToStr(Var1));ただし、 try except ブロックに入る必要があります。Var1次に、それが初期化され、クリーンなコードのように見えることがコンパイラーに明確になるはずです。

于 2012-07-19T08:04:57.143 に答える
0

これは非常に良い警告です。コードの他の場所で使用される可能性のある変数に値を割り当てないことを示しています。警告は、それが使用された場合、それに割り当てられた値が期待したものではない可能性があることも示しています。

于 2012-07-19T13:20:04.103 に答える