聊一下我今天通过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 那么你取出来的时候给他的默认返回值也应该是相同类型的