Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何禁止Java编译器使用null_Java_Compilation_Null - Fatal编程技术网

如何禁止Java编译器使用null

如何禁止Java编译器使用null,java,compilation,null,Java,Compilation,Null,我想尝试在Java代码中去掉null,但找不到任何关于如何自动(以简单的方式)确保提交不包含null 一个选项可能是在预提交钩子中运行完整语法分析器,并在肯定发现时拒绝钩子。但是,如果有人有一个指向如何执行此操作的指针,我也很感激,我希望能够告诉编译器将出现null关键字视为编译错误,以便它最终显示在开发人员的IDE以及CI系统中 以前有没有人尝试过这种方法,或者知道一种很好的方法?我知道更多像Scala这样的现代语言允许使用编译器插件,我也知道Java中的APT,但在这种情况下,所有这些似乎都

我想尝试在Java代码中去掉
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;
    }
}