簡體   English   中英

在使用@NotNull並在方法調用之前在另一個方法中檢查null時,如何避免出現null警告?

[英]How to avoid null warning when using @NotNull and checking for null in another method before method call?

我有一個復雜的驗證系統,簡化后的外觀類似於以下內容:

private static void mainMethod(@Nullable String startParam, @Nullable String nextParam) {

    String nextStep = methodSelect(startParam, nextParam);

    switch (nextStep) {
        case "none":
            break;
        case "goFinal":
            finalMethod(startParam);
            break;
        case "goNext":
            nextMethod(nextParam);
            break;
    }
}

private static void nextMethod(@NotNull String nextParam) {
    System.out.println(nextParam);
}

private static void finalMethod(@NotNull String startParam) {
    System.out.println(startParam);
}

@NotNull
private static String methodSelect(@Nullable String startParam,@Nullable String nextParam) {
    if (startParam == null && nextParam == null) {
        return "none";
    } if (startParam == null) {
        return "goNext";
    } else {
        return "goFinal";
    }
}

但是當在switch語句中調用finalMethod()和nextMethod()關於“參數x可能為空”時,即使在methodSelect()和switch語句隨后確保這些參數不會為空的情況下,我也得到警告。 我如何正確擺脫這些警告,希望在這些方法中或之前無需再次檢查null? 謝謝!

我正在使用IntelliJ IDEA 2016.3.4,Java 8和注釋:

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

這是非常棘手的代碼-您正在模仿反射,以根據運行時測試調用不同的方法。

在IntelliJ IDEA中,您將希望在IDE中或通過代碼注釋抑制警告。

其他一些工具具有更復雜的代碼分析。 這是代碼的一個略微變體,它使用布爾值而不是字符串來指示要調用的方法。 由於后置條件注釋@EnsuresNonNullIf ,Checker框架的Nullness Checker能夠驗證此代碼的nullness-safety。

import org.checkerframework.checker.nullness.qual.*;

class Example {

  private static void mainMethod(@Nullable String startParam, @Nullable String nextParam) {

    if (! useFinal(startParam)) {
      // do nothing
    } else {
      finalMethod(startParam);
    }
  }

  private static void nextMethod(@NonNull String nextParam) {
    System.out.println(nextParam);
  }

  private static void finalMethod(@NonNull String startParam) {
    System.out.println(startParam);
  }

  @EnsuresNonNullIf(expression="#1", result=true)
  private static boolean useFinal(@Nullable String startParam) {
    if (startParam == null) {
      return false;
    } else {
      return true;
    }
  }

}

@EnsuresNonNullIf批注當前不處理原始代碼中使用的字符串。 您可以向維護者請求此類擴展,也可以自己實施,然后提交請求請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM