【问题标题】:Variable might not have been initialized in Delphi function变量可能尚未在 Delphi 函数中初始化
【发布时间】:2017-08-16 07:45:09
【问题描述】:

我正在构建这个函数,它将返回查询是否返回 ID。我是 Delphi 的新手,我得到了错误

变量 emailExistsId 可能未初始化。

我的代码:

function emailExists (const APersonId: TStandardPK) : Boolean ;
var
  Email : TPhoneEmail;
  emailExistsId: TStandardPK;

begin
  Email := TPhoneEmail.Create(nil);
  try
    emailExistsId :=  Email.qrySelect.FieldByName('id').AsFloat;
  finally
    if emailExistsId <> 0  then
    Result := TRUE
    else
    Result :=False;
  end;
end;

【问题讨论】:

  • @DalijaPrasnikar 如果没有分配电子邮件,为什么会有例外?我的阅读是,如果没有分配电子邮件,id 的值将为零。虽然id 被认为是一个浮点数有点奇怪....
  • 有浮点主键真好 :)
  • @DavidHeffernan line Email.qrySelect.FieldByName('id').AsFloat 可以抛出异常。如果是这样,那么在 try 块中分配给 emailExistsId 的操作将不会完成。
  • @DavidHeffernan 因为这似乎是 OP 想要的。我并不是说这是好还是坏的方法,没有更多的上下文很难说。我见过很多这样的代码,人们期望得到布尔结果,而他们得到的只是他们没有准备好的异常。
  • @kobik,我当然是在开玩笑 :) 我很欣赏这种情况下的创造力。

标签: delphi


【解决方案1】:

提示是正确的。考虑代码:

try
  emailExistsId := Email.qrySelect.FieldByName('id').AsFloat;
finally
  if emailExistsId <> 0  then
    Result := TRUE
  else
    Result :=False;
end;

如果对Email.qrySelect.FieldByName('id').AsFloat 的评估导致异常,则不会为emailExistsId 分配值。然后,您的代码会在未初始化状态下读取 emailExistsId。因此编译器产生一个提示。当然这一切都没有实际意义,因为异常传播并且调用者在任何情况下都不会收到返回值。

无论如何,您的代码都过于复杂,而且会泄漏。应该是:

function emailExists(const APersonId: TStandardPK): Boolean;
var
  Email: TPhoneEmail;
begin
  Email := TPhoneEmail.Create(nil);
  try
    Result := Email.qrySelect.FieldByName('id').AsFloat <> 0;
  finally
    Email.Free;
  end;
end;

【讨论】:

  • 谢谢,我喜欢这段代码 :) 我会在几分钟内接受它
  • 顺便说一句,我想知道你为什么使用AsFloat。在我看来,一个名为 id 的东西会是一个浮点值,这对我来说似乎很奇怪。
  • 这是因为 ID 是浮点数。一个问题, qryselect 里面有一个参数,我怎么能调用查询也传递值?
  • 好的,很公平!至于与参数有关的问题,那是完全不同的问题。我们没有足够的细节来回答这个问题,但无论如何,您不应该在 cmets 中提出新问题。
  • 您写道:“这是因为 ID 是浮点数”。那可能是一个错误的设计。数字 ID 应该是序数类型,例如整数。
猜你喜欢
  • 2012-03-25
  • 2015-07-04
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多