我有以下代码:
boolean needToAddToMap = false;
Required required;
synchronized(requiredMap)
{
if (requiredMap.containsKey(userId))
{
required = parserSetAndActionsMap.get(userId);
}
else
{
logger.warning("userId not found in map, adding now.");
needToAddToMap = true;
}
}
if (needToAddToMap)
{
required = addNewRequired(userId);
}
后来我使用了required,但是得到了一个错误,即使"required"已经明确初始化了。这可能被认为是编译器中的一个错误,但我理解捕捉所有情况在计算上是困难的(甚至是不可能的)。
有几种可能的解决方案:
- 禁止警告(不确定是否可能)
- 初始化为null
- 使用更长时间的锁,或者使用锁两次
这两种解决方案听起来都不理想,哪个是最好的?还有其他解决方案吗?
避免"变量可能尚未初始化"的最佳实践?
为了避免它,你必须初始化它,我不认为将它设置为null
会花费你任何东西,或者会导致任何不好的事情,但它肯定会防止它引起并引发这个异常。
请记住,局部变量在使用它之前应该用value初始化。
初始化为null
:
Required required= null ;
所以你可以在if
语句中使用它
你必须初始化它,这样编译器才会高兴否则你可以选择最好的/首选的方式来初始化它,就像这样:
Required required = null;
synchronized(requiredMap)
{
if (requiredMap.containsKey(userId))
{
required = parserSetAndActionsMap.get(userId);
}
else
{
logger.warning("userId not found in map, adding now.");
}
}
if (null == required)
{
required = addNewRequired(userId);
}
或者如果你真的不喜欢初始化为null,就像这样避免它:
Required required = addNewRequired(userId);;
synchronized(requiredMap)
{
if (requiredMap.containsKey(userId))
{
required = parserSetAndActionsMap.get(userId);
// remove userId from required
}
}
我们有很多版本的代码,只要选择一个你认为最适合你的程序需求