2013-07-27 24 views
-2
class test 
{ 
    public static myclass x; 

    test() { 
     try { 
      x=new myclass(); 
      //x is not null here 
     } catch(Exception e) {/*stuff*/} 
     //not null here 
    } 

    //x is null here in any other member method 
} 

请解释此行为的原因? 构造函数块结束后,是不是需要保留一个值而不是丢失它的构造函数?构造函数后的空值

+1

这很难说发生了什么,没有看到更多的代码。你能告诉我们如何以及从哪里访问'x'? –

+0

我很抱歉通过移动设备进出口。但其他类是一个普通的简单类抛出异常每种方法 –

+0

我试图访问x在所有使用x == null的注释的地方如果语句 –

回答

4

你似乎是用实例值混淆静态值。

x是静态的,但它没有在静态初始化块中初始化。只有当您创建实例test(通过该实例的构造函数)时才会初始化。还要注意,只要你创建一个test的新实例,它就会重新初始化,这可能会给你造成一些非常奇怪的错误。当运行时加载

class test 
{ 
    public static myclass x; 

    static 
    { 
     x=new myclass(); 
    } 
} 

这样x应该只初始化一次,静态,:

为了x被初始化为该类的静态值,将其添加到一个静态初始化块类。这将允许在不首先创建test的实例的情况下访问它,并且消除在test的任何新实例上重新初始化它的错误。

相反,如果这应该替代地是实例值,而不是一个静态值,你可以简单地改变它的声明:

public myclass x; 
1

这样的代码是正确的。但由于变量xstatic,因此您可能在调用构造函数之前访问它。在那种情况下它将是空的。只要构造函数第一次运行,x的值将被设置为一个新的对象。

如果您的要求保持x静态。在静态初始化块中初始化它。像:

class test 
{ 
public static myclass x; 
static { 
    x = new myclass(); 
    } 
} 

或简称为:

class test 
{ 
public static myclass x = new myclass(); 
} 
+0

Java不允许非静态,因为我在这个类中有一个main。那就是为什么我用另一种方法检查构造函数之后。那里是空的。然而,我在防卫地点使用了“新”,没有应用错误 –

+0

@XperiazX看到我的编辑。 – Ankit