Java检查变量是否已初始化

Cal*_*YSR 37 java variables initialization

所以我对Java很新.在我的大学上课时,这个第一学期的重点是在使用名为ObjectDraw的java库时将语法缩小,并掌握一些基本思想.下学期我们将开始远离ObjectDraw并进入核心Java.无论如何我遇到了一些问题,我需要使用类似于php的isset函数.我知道php和java是完全不同的,所以我不应该尝试比较它们,但php是我以前对类似编程的知识的唯一基础.我只是想知道是否有某种方法会返回一个布尔值,表示实例变量是否已初始化.例如...

if(box.isset()) {
  box.removeFromCanvas();
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我遇到了这个问题,当我的程序试图隐藏或删除尚未构建的对象时,我遇到运行时错误.

Jon*_*eet 67

不是真的-有一个字段(实例变量或类变量)尚未明确分配之间绝对没有任何区别可言着呢,已经分配了它的默认值一个- 0,假,空等等.

现在,如果您知道一旦分配,该值将永远不会重新赋值为null,您可以使用:

if (box != null) {
    box.removeFromCanvas();
}
Run Code Online (Sandbox Code Playgroud)

(这也避免了可能NullPointerException)但你需要知道"值为null的字段"与"未明确赋值的字段"不同.Null是一个完全有效的变量值(当然,对于非原始变量).实际上,您甚至可能希望将上述代码更改为:

if (box != null) {
    box.removeFromCanvas();
    // Forget about the box - we don't want to try to remove it again
    box = null;
}
Run Code Online (Sandbox Code Playgroud)

局部变量的差异也是可见的,在它们被"明确赋值"之前无法读取 - 但是可以明确赋值的其中一个值为null(对于引用类型变量):

// Won't compile
String x;
System.out.println(x);

// Will compile, prints null
String y = null;
System.out.println(y);
Run Code Online (Sandbox Code Playgroud)

  • @bedbad:我看不出任何让我困惑的迹象,http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.3显示字段是变量.OP似乎对我的回答感到满意...... (4认同)
  • @bedbad:不,你害怕我只是完全错了.字段*是*类成员,但它只是*一类*类成员.来自http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.6:"类主体可能包含类成员的声明,即字段(§8.3),方法(§8.4),类(§8.5)和接口(§8.5)." 您提到的文档并不是说您认为它的含义 - 这很容易显示,因为如果您使用反射API调用`Class.getDeclaredFields`(该文档正在描述),您将无法获取方法的值或嵌套类型. (3认同)
  • 他明确询问了一个*实例变量*."实例"表示范围:也称为非静态字段.将其与局部变量(方法中的变量)或类变量(静态字段)进行对比.你删除了一些评论,所以我们错过了上下文,但据我所知,问题得到了解答,并添加了额外的信息 (3认同)
  • 很好的解释,但它完全错误:如果未像Box box一样初始化box,则不会编译;if(box!= null)//错误 (2认同)
  • @thang:您认为哪一部分是错误的?字段 * 是 * 变量,正如我在 JLS 中演示的那样。所有字段*都*隐式初始化为该类型的默认值。局部变量*不*隐式初始化。当有很多讨论并且您的评论如此广泛时,很难以更具体的方式发表评论。 (2认同)

Pro*_*gun 7

实例变量或字段以及静态变量根据变量类型分配默认值:

int:0
char:'\ u0000'或0
double:0.0
boolean:false
reference:null

只是想澄清局部变量(即在块中声明,例如,方法,for循环,while循环,try-catch等)未初始化为默认值,必须显式初始化.

  • “MyClass 对象”的默认值是多少?是否是对象引用(默认值:“null”)? (3认同)