关于SharedPreferences取出数据时报java.lang.*****cannot be cast to java.lang.*****的错误

聊一下我今天通过SharedPreferences存取数据时 取出数据碰到java.lang.cannot be cast to java.lang.的错误 也算小踩一个坑

  • 先上一波我存储数据的代码

数据存入

  public static void put(Context context, String key, Object object) {
        if (context == null) {
            return;
        }
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }
        SharedPreferencesCompat.apply(editor);
    }

数据取出

public static Object get(Context context, String key, Object defaultObject) {
        if (context == null) {
            return null;
        }
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);

        if (defaultObject instanceof String) {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
        }

        return null;
    }

这两个方法都是常规的数据存取方法 并没有什么太大的区别
然后先把数据put进去

 SpUtils.put(StartActivity.this, "token", bean.getData().getToken());
 SpUtils.put(StartActivity.this, "login", bean.getData().isIs_login());

这里说明下 token存进去的是一个String ,login是一个Boolean
接下来是提取出来

    private static String token;
    private static boolean login;

    token = (String) SpUtils.get(this, "token", "");
    login = (boolean) SpUtils.get(this,"login","");

咋一看 没什么问题啊 很简单的一波操作啊
运行试一下 token的获取没有问题 完美的取了出来 但是login取出来的时候 就直接给我抛了一个java.lang.cannot be cast to java.lang.
后来我debug一下 发现 在取出来的时候 直接在
if (defaultObject instanceof String){
return sp.getString(key, (String) defaultObject);
}
的时候就进去了 直接返回的是一个string类型的值
这是因为 在取出数据的时候
login = (boolean) SpUtils.get(this,”login”,”“);
中第三个参数也就是defaultObject是一个默认值
判断那里是以defaultObject为判断条件的 判断defaultObject处的是什么类型再决定返回什么类型
这一个取出中 “” 是一个string类型的 而要取出来的login是一个Boolean值 所有导致强转报错
正确的写法应该是

login = (boolean) SpUtils.get(this,"login",false);

你存进去的是Boolean 那么你取出来的时候给他的默认返回值也应该是相同类型的

猜你喜欢

转载自blog.csdn.net/qq_40967402/article/details/82057413