Java 在方法调用之前,在另一个方法中使用@NotNull并检查null时,如何避免null警告?
我有一个比较复杂的验证系统,简化后的系统如下所示:Java 在方法调用之前,在另一个方法中使用@NotNull并检查null时,如何避免null警告?,java,intellij-idea,annotations,nullable,notnull,Java,Intellij Idea,Annotations,Nullable,Notnull,我有一个比较复杂的验证系统,简化后的系统如下所示: private static void mainMethod(@Nullable String startParam, @Nullable String nextParam) { String nextStep = methodSelect(startParam, nextParam); switch (nextStep) { case "none": break; c
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可能为null”的警告,即使methodSelect()和之后的switch语句确保这些参数不会为null。
我如何正确地消除这些警告,希望在这些方法中或之前不会再次检查null?谢谢
我正在使用IntelliJ IDEA 2016.3.4、Java 8和注释:
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
这是一段非常棘手的代码——您正在模仿反射,根据运行时测试调用不同的方法
在IntelliJ IDEA中,您将希望通过或来抑制警告
其他一些工具有更复杂的代码分析。
下面是代码的一个微小变体,它使用布尔值而不是字符串来指示要调用的方法。由于postcondition注释,Checker框架的用户能够验证此代码的空值安全性
@EnsuresNonNullIf
注释当前未处理原始代码中使用的字符串;您可以向维护人员请求这样的扩展,也可以自己实现,然后提交一个请求。谢谢您的回答!
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;
}
}
}