Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 为什么有人默认使用@ParametersRenotnull?_Java - Fatal编程技术网

Java 为什么有人默认使用@ParametersRenotnull?

Java 为什么有人默认使用@ParametersRenotnull?,java,Java,我在代码中看到了这一点,其中有一个 @ParametersAreNotNullByDefault public class A { private String id; public A(final String id) { this.id = id; } } 这个注解给我们买了什么?有了这个注释,我们不应该像这样做检查吗 if (id==null) throw new IllegalArgumentException(); 我猜你提到的注释实际上是@ParametersAreNonnu

我在代码中看到了这一点,其中有一个

@ParametersAreNotNullByDefault 
public class A
{
private String id;

public A(final String id)
{
this.id = id;
}
}
这个注解给我们买了什么?有了这个注释,我们不应该像这样做检查吗

if (id==null)
throw new IllegalArgumentException();

我猜你提到的注释实际上是
@ParametersAreNonnullByDefault
,考虑到谷歌根本不知道注释
@ParametersAreNonnullByDefault

有一些关于这个注释的文档,以及一个相关的SO问题(我相信这或多或少回答了您的问题)

使用中注释的实现,将生成以下代码:

@ParametersAreNonnullByDefault
public class NonnullTest
{

    public static boolean parameterIsNull(Object o)
    {
        return (o == null);
    }

    public static void main(String[] args)
    {
        boolean str = parameterIsNull("foo");
        boolean nul = parameterIsNull(null);

        System.out.println("String returned: " + Boolean.toString(str));
        System.out.println("null returned: " + Boolean.toString(nul));
    }

}
编译和执行时无错误,并打印:

String returned: false
null returned: true
因此,该注释似乎不能有效防止通过异常等传递
null
值,并且您仍然需要检查参数是否无效


这与我在JSR-305项目页面上读到的内容一致,这似乎表明它添加的注释的要点是静态代码分析。

但它实际上检查空值吗?我用一个简单的测试用例更新了我的答案,以证明它实际上没有检查空值。哦,老鼠。。。如果我使用JetBrains的NotNull,如果它违反了条件,它将抛出异常,但是如果我使用标准Nonnull(或者默认情况下使用参数ARENONNULLBYDEFAULT),它不会抛出异常。尽管IDEA确实允许我配置要使用的注释,但它似乎只对类进行了检查(