如何禁止Java编译器为null

时间:2016-01-28 14:19:31

标签: java compilation null

我想尝试在我的Java代码中删除null,并且无法找到有关如何自动确保(以简单的方式)提交不包含null的任何内容

一个选项可能是在预提交钩子中运行完整的语法分析器,并拒绝正面发现的钩子。如果某人有指示如何做到这一点,我们也很感激,但是,我很乐意告诉编译器将null关键字的出现视为编译错误,这样它最终会出现在开发人员的IDE以及CI系统中。

之前有没有人试过这个和/或知道这样做的好方法?我知道像Scala这样的现代语言允许使用编译器插件,而且我知道Java中的APT,但在这种情况下,这些似乎都没有帮助。

2 个答案:

答案 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.getMap.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会发出警告。