sonarLint 抱怨 "Null pointers should not be dereferenced (squid:S2259)" 尽管处理了这种可能性

sonarLint complains "Null pointers should not be dereferenced (squid:S2259)" despite that possibility being handled

所以我有一个关于 SonarLint 的问题,我不知道如何处理。

假设我有一个 class 方法

public class Class(RemoteContext context)
    RemoteContext context = context;

    public void String method(String data) {
        if(data == null)
            context.raiseException("data can't be null");

        //do stuff with data like data.get();
    }

当我用 sonarLint (3.2.) 分析这个 class 时,我得到一个 Null pointer should not be dereferenced 问题。

所以我的问题是。如何解决这个问题? context.RaiseException 将停止方法执行,所以我认为这是误报。

应用程序有很多案例(classes/methods)有这个问题。 所以我认为注释是一种矫枉过正(到处都是丑陋的代码) 我也可以在每次 raiseException() 调用后键入 return,但我的印象不是 "programmers way"。

我猜最好是编写自己的规则。

我正在查看主题并四处搜索,但没有找到任何对这种情况有用的东西,当我不得不做 "opposite" 声纳实际做的事情时。 不是提出问题,而是对方法有点 "giving a green light"?

希望我对这个问题足够清楚。

如果RemoteContext是你控制的class,而你真的不想使用通常的new ExceptionType(...)模式,我会把RemoteContext改成构建异常但不抛出它,然后

if (data == null) {
    throw context.buildException("data can't be null");
}

...以便 SonarLint、Java 编译器以及稍后处理代码的程序员都清楚该方法的执行在该点停止(因为 "raise exception" 可以意味着很多事情)。

(是的,这意味着要更改很多地方,但相对简单的搜索和替换即可实现。)

没有真正优雅的方法来解决这个问题。什么有效:

 public SomeException createAndThrow() {
   throw new SomeException();
 }

像这样使用:

 throw createAndThrow();

给你点赞"double locking":

  • 您的实用程序方法抛出...但万一它不会抛出
  • 您假设异常对象只是 returned,所以让我们抛出那个

其他语言,比如C++甚至允许表达:这个method/function一般不支持return。但是 Java 不提供。