检查可为空的 int 会导致问题
Checking a nullable int causes problems
我有以下方法:
public void myMethod (@Nullable int number) {
if (number == null) {
}
}
导致编译错误,说null
和int
不能比较。但是 number
被标记为 @Nullable
属性!这意味着它 可以 为空,对吧?
当我尝试用 null
调用方法时,编译器再次出错。如果是这样,为什么我可以首先将 int 标记为 nullable?
我只想问为什么我可以将一个 int
标记为 nullable 但我不能将其设置为 null。
将整数更改为整数。
Null 只能分配给对象,不能分配给原始类型。
使用 int 的包装器 class 即 Integer.
在你的情况下,number 应该是不可空的,因为它是原始类型,而 null 永远不能分配给原始类型。
@Nullable
是注释。注释只是元数据。你需要一些外部的东西来让它变得有用。您最多可以使用注释来指定它们可以注释的内容。这是通过 @Target
和各种 ElementType
枚举常量提供的。
其中,是PARAMETER
(默认是一切都可以注释)。 PARAMETER
允许您注释方法参数。如果您只将 PARAMETER
设置为 @Target
,那么如果您尝试在其他任何地方使用注释,编译器将出错。这是编译器自己可以给你的最多的(YMMV 对于一些内置的注释类型)。
在所有其他情况下,您需要构建一些东西来处理注释,无论是在编译时还是在运行时。在这种情况下,用 @Nullable
注释该参数是完全没有意义的。
显然,int
是原始类型。 null
是 null 类型的唯一值,可分配(或强制转换)给引用类型。基元不能与引用类型进行比较(通过 boxing/unboxing 操作除外)。
所以
someIntValue == null
是可以在编译时验证语法错误的东西。这个
@Nullable int number
不能。只是一个参数注解。
Primitive data types cannot be null
. You can assign a null
value to an object, but not to primitives; change it to Integer
将原始类型 int
的值包装在对象中。
这个注解常用来消去NullPointerExceptions
。 @Nullable
经常说这个参数可能为空。
另请参阅 https://github.com/google/guice/wiki/UseNullable(Google Guice)
在这个轻量级依赖注入框架中,你告诉这个依赖可能是空的。如果您尝试传递 null 并且没有注释,框架将拒绝执行它的工作。
参考:https://www.jetbrains.com/idea/help/nullable-and-notnull-annotations.html
@Nullable 是一种类型注释,如果您检查 @Nullable(https://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/Nullable.java?r=24) and @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 是原始类型。这有望在编译时进行强类型检查
我有以下方法:
public void myMethod (@Nullable int number) {
if (number == null) {
}
}
导致编译错误,说null
和int
不能比较。但是 number
被标记为 @Nullable
属性!这意味着它 可以 为空,对吧?
当我尝试用 null
调用方法时,编译器再次出错。如果是这样,为什么我可以首先将 int 标记为 nullable?
我只想问为什么我可以将一个 int
标记为 nullable 但我不能将其设置为 null。
将整数更改为整数。
Null 只能分配给对象,不能分配给原始类型。
使用 int 的包装器 class 即 Integer.
在你的情况下,number 应该是不可空的,因为它是原始类型,而 null 永远不能分配给原始类型。
@Nullable
是注释。注释只是元数据。你需要一些外部的东西来让它变得有用。您最多可以使用注释来指定它们可以注释的内容。这是通过 @Target
和各种 ElementType
枚举常量提供的。
其中,是PARAMETER
(默认是一切都可以注释)。 PARAMETER
允许您注释方法参数。如果您只将 PARAMETER
设置为 @Target
,那么如果您尝试在其他任何地方使用注释,编译器将出错。这是编译器自己可以给你的最多的(YMMV 对于一些内置的注释类型)。
在所有其他情况下,您需要构建一些东西来处理注释,无论是在编译时还是在运行时。在这种情况下,用 @Nullable
注释该参数是完全没有意义的。
显然,int
是原始类型。 null
是 null 类型的唯一值,可分配(或强制转换)给引用类型。基元不能与引用类型进行比较(通过 boxing/unboxing 操作除外)。
所以
someIntValue == null
是可以在编译时验证语法错误的东西。这个
@Nullable int number
不能。只是一个参数注解。
Primitive data types cannot be null
. You can assign a null
value to an object, but not to primitives; change it to Integer
将原始类型 int
的值包装在对象中。
这个注解常用来消去NullPointerExceptions
。 @Nullable
经常说这个参数可能为空。
另请参阅 https://github.com/google/guice/wiki/UseNullable(Google Guice)
在这个轻量级依赖注入框架中,你告诉这个依赖可能是空的。如果您尝试传递 null 并且没有注释,框架将拒绝执行它的工作。
参考:https://www.jetbrains.com/idea/help/nullable-and-notnull-annotations.html
@Nullable 是一种类型注释,如果您检查 @Nullable(https://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/Nullable.java?r=24) and @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 是原始类型。这有望在编译时进行强类型检查