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 回答