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

时间:2015-06-01 16:27:11

标签: java

我有以下代码:

    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. 使用锁更长时间,或使用锁两次
  4. 这些解决方案都不是理想的,最好的是什么?任何其他解决方案?

2 个答案:

答案 0 :(得分:3)

  

避免“变量可能尚未初始化”的最佳做法?

为了避免它,你必须初始化它,我不认为将它设置为null会给你带来任何损失,或者会给你带来任何坏事,但它肯定会阻止它引起并提高它异常。

请记住,在使用之前,应该使用值初始化局部变量。

所以只需将其初始化为null

Required required= null ;

因此,您可以在if声明中使用它。

答案 1 :(得分:1)

你必须初始化它,所以编译器会很高兴,否则你可以选择最好的/首选的方式来初始化它像这样:

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
    }
}

我们最终得到了这个代码的众多版本,只需选择您认为最适合您的程序要求的代码