java.lang.StackOverflowError

来源:互联网 发布:反向传播算法 推导 编辑:程序博客网 时间:2024/06/13 02:55

项目中遇到这个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初始化及类的加载]

0 0