如何检查int是否已初始化?

10

如何检查我声明的int变量是否已初始化?number == null无法工作,因为int是原始类型。

这个问题不相关,因为用户询问如何检查int是否为空,回答者建议使用Integer。然而,我想检查原始数据类型int是否已初始化。

这个问题也不相关,因为它是针对引用类型的,而我是在问关于原始类型的。已经澄清了,仍被标记……


1
这个 int 是一个字段还是局部变量? - Logan
2
同样的问题已经有了答案。如果它不是一个本地变量,检查它是否为0。如果它是一个本地变量,它将无法编译。 - Thiyagu
@user7 为什么不能编译? - NiVeR
Java有一个明确赋值的概念。在使用变量之前,必须对其进行明确的赋值。 - Logan
哦,好的,如果你使用它就无法编译。我错过了这一点。 - NiVeR
对于字段而言,如果您没有初始化基本类型,Java编译器将会进行初始化。https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 在您的情况下,Java会将其设置为0。因此,您可以检查变量是否等于0。 - Joshua Benz
2个回答

9

实例字段被初始化为null、0等。局部字段不会被初始化。除非尝试使用该字段并生成异常,否则无法测试这一点。一个好的实践是在声明局部变量时始终进行初始化。


2
好的答案。如果关心检测初始化,请使用Null与对象包装器一起使用,为每个八种基本类型定义一个类。例如,Integer类用于int原始类型。 Integer i = null;if(null == i){i = 42;}自动装箱会自动将原始类型int包装成Integer对象。 - Basil Bourque
虽然我同意这一点,但设计Spring的人决定以另一种方式初始化bean属性并使默认赋值变得多余(更不用说具有误导性了)。别把怒火撒在信使身上,我认为Spring是令人难以接受的。 - Sridhar Sarnobat

3

如果是字段变量,您可以通过比较int与默认值0来进行检查:

private int x: // default 0 for an int
... 
public void foo(){
  if (x == 0){  // valid check
    // ...
  }
}   

内置类型具有默认的“合理”值

默认值

在声明字段时,不一定总是需要分配一个值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,这个默认值将取决于数据类型,通常为零或null。然而,依赖这种默认值通常被认为是不好的编程风格。

以下图表总结了上述数据类型的默认值。

数据类型   默认值(对于字段)
byte    0
short   0
int     0
long    0L
float   0.0f
double  0.0d
char    '\u0000'
String(或任何对象)      null
boolean false

对于局部变量,不需要检查甚至也不可能检查,因为编译器会为您检查。如果任何语句引用未初始化的变量,则编译将无法通过。因此,检查int局部变量的代码本身也不会编译通过。

public void foo(){
    int a;      
    if (a==0) { // doesn't compile : The local variable a may not have been initialized     
      ...   
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接