【问题标题】:Is there a Sonar, Findbugs, or PMD rule that detects this possible NPE that CodePro detects?是否有 Sonar、Findbugs 或 PMD 规则来检测 CodePro 检测到的这种可能的 NPE?
【发布时间】:2013-04-10 22:04:56
【问题描述】:

假设我有这样一段代码:

Map<String, Object> mappy = 
    (Map<String, Object>)pExtraParameters.get(ServiceClientConstants.EXTRA_PARAMETERS);

if (pSSResponseBean!=null) {
    mappy.put(AddressResearchContext.CSI_RESPONSE_BEAN, (AddressNotFoundResponseBean)pSSResponseBean); // this line may  throw null pointer
}

是否存在将“mappy”标记为可能为空的 Sonar、Findbugs 或 PMD 规则?显然 CodePro 标记了这一点,如果可能的话,我需要提供类似的东西。

【问题讨论】:

    标签: java sonarqube findbugs pmd codepro


    【解决方案1】:

    问题在于 FindBugs 将未注释的项目视为使用 @Nullable 注释的项目,这导致它忽略对它们的空性检查。您可以创建一个空的 java.util 包,并使用自定义 @ReturnValuesAreCheckForNullByDefault 注释(修改 @ReturnValuesAreNonnullByDefault)进行注释,但它将应用于该类中 every 中的 every 方法包。

    @ReturnValuesAreCheckForNullByDefault
    package java.util;
    
    import edu.umd.cs.findbugs.annotations.ReturnValuesAreCheckForNullByDefault;
    

    另一种选择是创建使用@CheckForNull 注释的Map 外观。

    public class AnnotatedMap<K, E> implements Map<K, E>
    {
        private final Map<K, E> wrapped;
    
        @CheckForNull
        public E get(K key) {
            return wrapped.get(key);
        }
        ...
    }
    

    更新:请参阅我的previous answer 以了解有关实施此建议的完整详细信息。

    【讨论】:

    • 我不太了解第一种技术。你只是说在我的源代码树中定义一个带有该注释的“java/util/package-info.java”吗?我想知道这是否会与 JDK 中该包的现有“package-info.java”冲突?
    • 我也对您对“自定义”注释的引用感到困惑。我猜你是说我们应该基于现有的 @ReturnValuesAreNonnullByDefault 注释来定义该注释,但我不知道新注释应该与现有注释有何不同。
    • 哦,我猜stackoverflow.com/questions/14194304/… 与此有关。
    • @DavidM.Karr - 是的,感谢您找到该链接。我在写这个答案时被打断了。您理解正确,只是它似乎不会干扰现有的包裹信息。在 JDK 中,它们仅包含包 cmets AFAIK。新注解的不同之处在于使用@CheckForNull 而不是@Nonnull 进行注解。这会将前者应用于该包中的所有方法返回值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2011-12-30
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多