检查可空int会导致问题

时间:2015-08-12 03:36:43

标签: java annotations nullable

我有以下方法:

public void myMethod (@Nullable int number) {
    if (number == null) {

    }
}

导致编译器错误,表示无法比较nullint。但number标有@Nullable属性!这意味着可以为空,对吧?

当我尝试用null调用方法时,编译器错误再次出现。如果是这种情况,为什么我可以在第一个位置标记int nullable?

我只是想问为什么我可以标记int可空,但我不能将其设置为空。

5 个答案:

答案 0 :(得分:3)

将int更改为Integer Null只能分配给Objects而不能分配给原始类型 使用int的包装类,即Integer。

在你的情况下,数字不应该是可空的,因为它的基本类型和null永远不能分配给基本类型。

答案 1 :(得分:1)

@Nullable是一个注释。注释只是元数据。你需要一些外在的东西来使它变得有用。您可以使用注释做的最多的事情是指定它们可以注释的内容。这是通过@Target和各种ElementType枚举常量提供的。

其中,是PARAMETER(默认是所有内容都可以注释)。 PARAMETER允许您注释方法参数。如果您只将PARAMETER设置为@Target,那么如果您尝试在其他任何位置使用注释,编译器将会出错。这是编译器可以自己提供的最多(YMMV用于某些内置注释类型)。

在所有其他情况下,您需要构建一些将在编译时或运行时处理注释的内容。在这种情况下,用@Nullable注释该参数是完全没有意义的。

显然,int是一种原始类型。 null是null类型的唯一值,可以为引用类型赋值(或可以转换)。无法将基元与引用类型进行比较(通过装箱/拆箱操作除外)。

所以

someIntValue == null

是可以在编译时验证语法不正确的东西。此

@Nullable int number

不能。它只是一个参数注释。

答案 2 :(得分:1)

Primitive data types不能是null。您可以为对象分配null值,但不能为基元分配值;将其更改为Integer,其中包含对象中基元类型int的值。

答案 3 :(得分:0)

此注释通常用于消除NullPointerExceptions@Nullable经常表示此参数可能为null。

另见https://github.com/google/guice/wiki/UseNullable(Google Guice)

在这个轻量级依赖注入框架中,您可以告诉该依赖项可能为null。如果您尝试传递null并且没有注释,框架将拒绝执行它的工作。

参考:https://www.jetbrains.com/idea/help/nullable-and-notnull-annotations.html

答案 4 :(得分:0)

@Nullable是一个类型注释,如果你检查@Nullable(https://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/Nullable.java?r=24)和@NonNull(http://grepcode.com/file/repo1.maven.org/maven2/com.google.gwt/gwt-dev/2.5.1/javax/annotation/Nonnull.java)的来源

<@> @NonNull在@Nullable中使用,并且有一个条件在@NonNull代码中检查null,如下所示:

if (value == null)
     return When.NEVER; 

因此,异常可能在这里抛出,因为int是一种原始类型。预计在编译时会进行强类型检查