我想尝试在我的Java代码中删除null
,并且无法找到有关如何自动确保(以简单的方式)提交不包含null
的任何内容
一个选项可能是在预提交钩子中运行完整的语法分析器,并拒绝正面发现的钩子。如果某人有指示如何做到这一点,我们也很感激,但是,我很乐意告诉编译器将null
关键字的出现视为编译错误,这样它最终会出现在开发人员的IDE以及CI系统中。
之前有没有人试过这个和/或知道这样做的好方法?我知道像Scala这样的现代语言允许使用编译器插件,而且我知道Java中的APT,但在这种情况下,这些似乎都没有帮助。
答案 0 :(得分:2)
我将此解释为一个问题,询问是否可以从Java源代码中自动执行“消除空值”的任务。 (要求一个特定的工具,这是偏离主题!)
我还假设您正在讨论静态分析,因为检查是在提交之前完成的。
我认为答案是否定的。用静态分析消除所有null
是不可能的。
显然,在源代码中检测文字null
的实例很容易。但是,null
的其他来源更难以发现。
null
。null
。null
。假设的静态分析工具可以检测到由于上述情况而出现null
的许多情况。但不是所有的。
例如:
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap();
map.put(args[0], "OK");
String answer = map.get(args[1]);
}
}
静态分析器无法证明answer
将是或不会null
...因为它取决于程序的输入。它可以证明它可能是null
...但只有当它“理解”Map.get
和Map.put
的语义时才会这样。
另:
public class Test {
private String answer;
public Test() {
if (/* do some complicated computation */) {
answer = "OK";
}
}
public static void main(String[] args) {
String answer = new Test().answer;
}
}
IMO是一种静态分析工具,它可以消除大型Java代码库中null
和NPE的所有来源,这超出了现有技术水平。而停机问题告诉我们,某些程序将无法进行明确的静态分析。
添加大量注释(如@NotNull
)可以帮助分析器......前提是它可以证明注释总是真正的断言。但是你不能只假设它们会存在,因为如果你这样做,你已经有效地将静态分析转化为运行时断言。
答案 1 :(得分:0)
IntelliJ IDEA有注释:
https://www.jetbrains.com/idea/help/nullable-and-notnull-annotations.html
@NotNull
@NotNull Annotation实际上是一份明确的合同声明 以下内容:方法不应返回null。变量(如 字段,局部变量和参数)不能保存空值。对于 更多信息和代码示例,请参阅在线操作方法。的IntelliJ 如果违反这些合同,IDEA会发出警告。