项目中遇到这个bug,栈溢出。
错误信息如下:
可以看到 47行与36行交替执行,出现此错误的原因是,递归调用导致函数层级过多,最后栈溢出。
比如,下面这段代码:
private static Context context;
private SpUtils instance;
public static SpUtils getInstance(Context context) {
setContext(context);
if (instance == null) {
sp = context.getSharedPreferences("pp_db", Context.MODE_PRIVATE);
instance = new SpUtils();
}
return instance;
}
private static void setContext(Context context){
getInstance(context).context=context;
}
上面代码的思路大抵是考虑到静态成员不能访问非静态成员,但却造成另一个更大的问题,形成了递归。
针对上面的递归,可以修改如下:
private Context context;
private SpUtils instance;
private SpUtils(Context context) {
this.context=context;
}
public static SpUtils getInstance(Context context) {
if (instance == null) {
sp = context.getSharedPreferences("pp_db", Context.MODE_PRIVATE);
instance = new SpUtils(context);
}
return instance;
}
这其实牵涉到初始化及类的加载顺序问题。一般来说,静态方法不能访问非静态成员,值得注意的是,构造也可以看成是static方法,虽然它没有加static修饰。类是在任何static成员被访问时加载的。[参考资料:java编程思想第四版7章145页7.9初始化及类的加载]