Eclipse null分析引发误报NullPointerException警告

时间:2014-12-29 05:26:39

标签: java eclipse nullpointerexception annotations

我正在尝试使用Messages类,而不是使用硬编码字符串进行用户显示。但是,我从Eclipse(Luna - 4.4.1)收到Potential null pointer access: this expression has a '@Nullable' type警告,其中包含以下代码:

在package-info.java中:

/**
 * My pacakge of tests.
 *
 * @author Flic
 */
@NonNullByDefault
package org.sample;

import org.eclipse.jdt.annotation.NonNullByDefault;

在Messages.java中:

package org.sample;

import static java.util.ResourceBundle.getBundle;

import java.util.*;
import org.eclipse.jdt.annotation.Nullable;

public class Messages
{
  private static final String BUNDLE_NAME = "org.sample.messages"; //$NON-NLS-1$
  private static final @Nullable ResourceBundle RESOURCE_BUNDLE = 
                                                 getBundle(BUNDLE_NAME);

  private Messages()
  {
  }

  public static @Nullable String getString(String key)
  {
    String msgVal = null;
    try
    {
      if (RESOURCE_BUNDLE != null)
        msgVal = RESOURCE_BUNDLE.getString(key);  // Warning on RESOURCE_BUNDLE
    }
    catch (MissingResourceException mrEx)
    {
      msgVal = '!' + key + '!';
    }

    return msgVal;
  }
}

如果我将成员变量复制到本地并检查相反,则警告消失:

public static @Nullable String getString(String key)
{
  ResourceBundle checkBundle = RESOURCE_BUNDLE;
  String msgVal = null;

  try
  {
    if (checkBundle != null)
      msgVal = checkBundle.getString(key);  // No warning here
  }
  catch (MissingResourceException mrEx)
  {
    msgVal = '!' + key + '!';
  }

  return msgVal;
}

任何人都可以解释为什么静态最终成员变量的空检查不足以避免潜在的空指针但是将其值赋给局部变量并检查是否正常?对String或Integer成员变量的类似检查很好 - 这似乎特定于ResourceBundle对象。

1 个答案:

答案 0 :(得分:0)

这似乎是Eclipse的nullness检查器中的一个错误。希望这将在Eclipse的更高版本中得到解决,但我也将看看Checker Framework。感谢那些看过并发表评论的人。