java因构造顺序引起的隐蔽异常

代码以下:
public abstract class Father_Test
{
public Father_Test()
{
System.out.println(createString());
}
public abstract String createString();
public static void main(String[] args)
{
new Son();
}
}

class Son extends Father_Test
{
private String str="chong";
@Override
public String createString()
{
// TODO Auto-generated method stub
return str.substring(0, 1);
}
}

乍一看代码写的没有问题,但是一运行就出现了NullPointerException的异常?那么异常究竟出如今什么地方呢?为何会出现呢?
问题出在构造函数的初始化顺序上。咱们应该知道当构造函数的初始化过程,结合上面代码,当咱们调用子类的构造函数时,java会先调用父类的构造函数以便先对父类中的各成员进行初始化,而父类构造函数中又调用了 createString()方法,java发现此方法是个抽象方法时会往子类中去找,直到找到一个实现了上述方法的方法体,这就是Son类中的 createString()方法,而此方法的返回值是 str.substring(0, 1)。问题就出在这里,由于各成员(也就是这里的str)还未初始化,子类中的构造函数还未执行到,那么此时的str应为null,那么出现空指针异常也就不足为奇了......
相关文章
相关标签/搜索