如何禁止Java编译器使用null
我想尝试在Java代码中去掉如何禁止Java编译器使用null,java,compilation,null,Java,Compilation,Null,我想尝试在Java代码中去掉null,但找不到任何关于如何自动(以简单的方式)确保提交不包含null 一个选项可能是在预提交钩子中运行完整语法分析器,并在肯定发现时拒绝钩子。但是,如果有人有一个指向如何执行此操作的指针,我也很感激,我希望能够告诉编译器将出现null关键字视为编译错误,以便它最终显示在开发人员的IDE以及CI系统中 以前有没有人尝试过这种方法,或者知道一种很好的方法?我知道更多像Scala这样的现代语言允许使用编译器插件,我也知道Java中的APT,但在这种情况下,所有这些似乎都
null
,但找不到任何关于如何自动(以简单的方式)确保提交不包含null
一个选项可能是在预提交钩子中运行完整语法分析器,并在肯定发现时拒绝钩子。但是,如果有人有一个指向如何执行此操作的指针,我也很感激,我希望能够告诉编译器将出现null
关键字视为编译错误,以便它最终显示在开发人员的IDE以及CI系统中
以前有没有人尝试过这种方法,或者知道一种很好的方法?我知道更多像Scala这样的现代语言允许使用编译器插件,我也知道Java中的APT,但在这种情况下,所有这些似乎都没有真正的帮助。IntelliJ IDEA为它提供了注释: @NotNull @NotNull注释实际上是一个显式的契约声明 以下内容:方法不应返回null。变量(如 字段、局部变量和参数)不能包含空值。对于 更多信息和代码示例,请参阅联机操作。IntelliJ IDEA会警告您是否违反了这些合同
我将此解释为一个问题,询问是否“理论上可能”自动执行Java源代码中的“消除空值”任务。(要求使用特定的工具来实现这一点是离题的!) 我还假设您谈论的是静态分析,因为检查是在提交之前完成的 我认为答案是否定的。不可能通过静态分析消除所有
null
s
显然,在源代码中很容易检测到文本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]);
}
}
IMO是一个静态分析工具,它可以消除大型Java代码库中的null
和NPE的所有源代码,这是最先进的。停顿问题告诉我们,在某些程序中,最终的静态分析是不可能的
添加大量注释(如
@NotNull
)可以帮助分析器。。。前提是它可以证明注释总是正确的断言。但你不能仅仅假设它们会这样,因为如果你这样做了,你已经有效地将静态分析转化为运行时断言。这看起来像是对非现场资源的请求,这是非主题的。我没有标记,但我建议进行编辑。不确定如何编辑。。我对资源真的不感兴趣。。如果我只是错过了编译器标志-XYZ,那就是我所需要的。我不想简单地问“是否存在这样一个编译器标志”,但如果你愿意,我可以在其他地方用“否”来回答一个更合适的问题。很多API方法都可以返回null
,所以如果你的源代码中不允许null
。。这可能有问题。当然,直到你团队中的一个聪明人决定创建一个方法为isNull的NullUtils
,giveMyNull
,等等。这个聪明人不在我的团队中。。他为Oracle工作,允许我编写Optional.ofNullable(thatAPIMethod())
。。所以是的,我说我想用它做实验,但那是因为我相信它已经不再有问题了。对不起,这不是我的观点。很好,但比我要找的要弱得多。它仍然允许用户编写一个新方法并返回null代码>从它。
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;
}
}