避免"variable might not have been initialized"的最佳做法



我有以下代码:

    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"已经明确初始化了。这可能被认为是编译器中的一个错误,但我理解捕捉所有情况在计算上是困难的(甚至是不可能的)。

有几种可能的解决方案:

  1. 禁止警告(不确定是否可能)
  2. 初始化为null
  3. 使用更长时间的锁,或者使用锁两次

这两种解决方案听起来都不理想,哪个是最好的?还有其他解决方案吗?

避免"变量可能尚未初始化"的最佳实践?

为了避免它,你必须初始化它,我不认为将它设置为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
    }
}

我们有很多版本的代码,只要选择一个你认为最适合你的程序需求

最新更新