Java Eclipse null分析引发假阳性NullPointerException警告

Java Eclipse null分析引发假阳性NullPointerException警告,java,eclipse,nullpointerexception,annotations,Java,Eclipse,Nullpointerexception,Annotations,我正在试验Messages类,而不是在用户显示中使用硬编码字符串。但是,我得到了一个潜在的空指针访问:这个表达式有一个来自Eclipse(Luna-4.4.1)的'@Nullable'类型警告,代码如下: 在package-info.java中: /** * My pacakge of tests. * * @author Flic */ @NonNullByDefault package org.sample; import org.eclipse.jdt.annotation.No

我正在试验Messages类,而不是在用户显示中使用硬编码字符串。但是,我得到了一个
潜在的空指针访问:这个表达式有一个来自Eclipse(Luna-4.4.1)的'@Nullable'类型
警告,代码如下:

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

有人能解释为什么静态final成员变量上的null检查不足以避免潜在的null指针,而是将其值赋给局部变量并检查是否正确吗?对字符串或整数成员变量进行类似的检查是可以的-这似乎是特定于ResourceBundle对象的。

这似乎是Eclipse的空值检查程序中的一个错误。希望这将在Eclipse的后续版本中得到解决,但我也将看看Checker框架。感谢那些查看并发表评论的人。

出于好奇,如果您使用
消息,它是否也会标记它。资源\u BUNDLE
?另外,虽然情况不一样,但他们目前正在努力消除这些误报。恐怕是的。但是谢谢你的建议。我真的很想使用注释,但我不喜欢被迫创建不必要的局部变量来掩盖这样的问题。我想知道我是否遗漏了一些明显的东西,或者这是某种错误。不幸的是,我认为这是一个错误。Eclipse文档建议创建局部变量,因为这样更容易进行静态分析。你可以试试a,看看它是否能解决问题。祝你好运我同意这是一个错误。我只是用Checker框架()附带的空值检查器尝试了这个示例,它没有发出误报警告。因此,如果您想要更强大、更精确的分析,而不需要使用不必要的局部变量来降低代码的质量,那么可以使用它来代替Eclipse的空分析。Checker框架唯一的缺点是它的IDE集成没有EclipseNull分析那么灵活。Eclipse中的错误在即将发布的4.5版本的里程碑6中已经修复。注意,这个示例需要启用“字段的语法空分析”,以便消除与并发性等相关的一些问题。