crmFactory.RegisterDemoAccount
抛出Exception
。为了使用变量res
,我需要初始化它。
由于AccountRegistrationResponse
无法初始化,如何在不获取有关使用未分配变量的编译错误的情况下声明res
?
我可以将它指定为null,但我认为这不是一个好的编程方法。
AccountRegistrationResponse res /*=null*/;
try
{
res = crmFactory.RegisterDemoAccount(CrmConfigRepository.CrmOwnerUserId
, CrmConfigRepository.CrmOrganizationName
, CrmConfigRepository.CrmBusinessUnitName
, demo.getData());
}
catch (Exception e)
{
_log.Error("Cannot create demo account", e);
}
_log.Debug(res.getString());
答案 0 :(得分:2)
在捕获未知异常后,您不应该尝试继续使用您的方法。任何事情都可能出错,假设继续下去是没有意义的。如果你尝试,只会发生坏事。
要么返回错误结果,要么更好,只需重新抛出原始异常:
catch (Exception e)
{
_log.Error("Cannot create demo account", e);
throw;
}
现在,编译器可以看到在try块成功完成后将始终分配res
。
答案 1 :(得分:1)
我理解你不愿意将res
指定为null - 这感觉毫无意义,因此也是错误的。然而,在这样的情况下,当在分配它的块之外需要一个对象时,这是一种常见的方法。假设你在try / catch块中分配你的变量做了正确的事情(在许多情况下它并不是一个不常见的模式),我不会担心它。
然而,如果作业失败会发生什么?第二次日志记录调用将尝试取消引用res
,并抛出NullReferenceException
。那不好。
答案 2 :(得分:0)
您需要将日志记录行放在try / catch中,以便编译器知道res
已初始化。
try
{
res = ...
_log.Debug(res.getString()); }
catch (Exception e)
{
_log.Error("Cannot create demo account", e);
}
答案 3 :(得分:0)
这是正确的方法。唯一的问题是,如果null
的有效返回值为RegisterDemoAccount
,则可以在bool initialized = false
之后添加true
RegisterDemoAccount
。
答案 4 :(得分:0)
如果你在try / catch之外需要它,就像你说的那样将它分配给null。编程方式并不错。
答案 5 :(得分:0)
但我不认为这是一种很好的编程方法。
为什么呢?如果您未初始化res
然后RegisterDemoAccount(...)
(或其前的其他表达式)抛出,则res
语句中将不会分配try
。
因此执行可以在catch
未分配的情况下到达最终声明(res
块之后)。
问题是在最后一个语句中使用res
- 编译器可以看到它可以在没有初始化的情况下达到这一点。