Rob*_*ert -2 java android classcastexception
我正在开发Android应用程序,并且已经实现了使用共享首选项进行所有处理的类。此类拥有用于获取首选项的通用方法,该方法具有通用性,它根据参数中的类型返回不同类型的数据类型。我存储到共享首选项和从共享首选项检索的数据类型为整数,字符串,布尔值和列表(使用JSON将列表序列化/反序列化到字符串或从字符串反序列化)。好了,一切都很好,我可以通过这种方式从共享的偏好中成功获取int,string和boolean,但不能成功获取List,因此我得到了:
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List
Run Code Online (Sandbox Code Playgroud)
我忘了告诉我们该方法已声明要返回一个Object,并且在调用该方法时,将返回值类型转换为正确的类型。无论如何,我不明白为什么它说不能转换字符串,甚至不返回字符串?这是执行此操作的正确方法吗,我的意思是返回对象然后进行转换完全正确。
以下用于获取共享首选项的完整方法。感谢您的任何建议!
public Object getPrefs(String sharedPreferences, String key, int type,
Context context, Object defaultObject) {
// A String indicating an error occurred while retrieving shared
// preferences
final String ERROR = "ERROR";
// Set shared preferences from context
sharedPref = context.getSharedPreferences(sharedPreferences,
Context.MODE_PRIVATE);
switch (type) {
case (0): // <-- Integer
// Check that defaultObject is of correct instance else collect
// "hardcoded" default value of 0
if (defaultObject instanceof Integer) {
this.logger.logCatTxt(
this.logger.getINFO(),
this.LOG_TAG + ":getPrefs()",
"Integer with value"
+ Integer.toString(sharedPref.getInt(key,
(Integer) defaultObject))
+ " retrieved from shared preferences: "
+ sharedPreferences + ", with key: " + key
+ ", type: " + Integer.toString(type)
+ ", context: " + context.toString()
+ " and default value: "
+ Integer.toString((Integer) defaultObject));
return sharedPref.getInt(key, (Integer) defaultObject);
} else {
this.logger
.logCatTxt(
this.logger.getERROR(),
this.LOG_TAG + ":getPrefs()",
"Default value couldn't be set because of instance mismatch, hardcoded default value of 0 is used. However Integer with value"
+ Integer.toString(sharedPref.getInt(
key, 0))
+ " retrieved from shared preferences: "
+ sharedPreferences
+ ", with key: "
+ key
+ ", type: "
+ Integer.toString(type)
+ ", context: "
+ context.toString()
+ " and default value: "
+ Integer
.toString((Integer) defaultObject));
return sharedPref.getInt(key, 0);
}
case (1): // <-- String
// Check that defaultObject is of correct instance else collect
// "hardcoded" default value of ""
if (defaultObject instanceof String) {
this.logger.logCatTxt(
this.logger.getINFO(),
this.LOG_TAG + ":getPrefs()",
"String with value"
+ sharedPref.getString(key,
(String) defaultObject)
+ " retrieved from shared preferences: "
+ sharedPreferences + ", with key: " + key
+ ", type: " + Integer.toString(type)
+ " and context: " + context.toString()
+ " and default value: "
+ (String) defaultObject);
return sharedPref.getString(key, (String) defaultObject);
} else {
this.logger
.logCatTxt(
this.logger.getERROR(),
this.LOG_TAG + ":getPrefs()",
"Default value couldn't be set because of instance mismatch, hardcoded default value of \"\" is used. However String with value"
+ sharedPref.getString(key, "")
+ " retrieved from shared preferences: "
+ sharedPreferences
+ ", with key: "
+ key
+ ", type: "
+ Integer.toString(type)
+ " and context: " + context.toString());
return sharedPref.getString(key, "");
}
case (2): // <-- Boolean
// Check that defaultObject is of correct instance else collect
// "hardcoded" default value of false
if (defaultObject instanceof Boolean) {
this.logger.logCatTxt(
this.logger.getINFO(),
this.LOG_TAG + ":getPrefs()",
"Boolean with value"
+ sharedPref.getBoolean(key,
(Boolean) defaultObject)
+ " retrieved from shared preferences: "
+ sharedPreferences + ", with key: " + key
+ ", type: " + Integer.toString(type)
+ " and context: " + context.toString()
+ " and default value: "
+ (Boolean) defaultObject);
return sharedPref.getBoolean(key, (Boolean) defaultObject);
} else {
this.logger
.logCatTxt(
this.logger.getERROR(),
this.LOG_TAG + ":getPrefs()",
"Default value couldn't be set because of instance mismatch, hardcoded default value of false is used. However Boolean with value"
+ sharedPref.getBoolean(key, false)
+ " retrieved from shared preferences: "
+ sharedPreferences
+ ", with key: "
+ key
+ ", type: "
+ Integer.toString(type)
+ " and context: " + context.toString());
return sharedPref.getBoolean(key, false);
}
case (3): // <-- List
// Retrieve secondaryListenNumbers to json string and clear
// secondaryListenNumbers List just to be sure that it's empty
String json = sharedPref.getString(key, "");
// List of Strings containing
List<String> list = new ArrayList<String>();
// If json string is not empty
if (json != "") {
try {
// Create a JSONArray from json string and retrieve strings
// from it and and them to secondaryListenNumbers List
JSONArray a = new JSONArray(json);
for (int i = 0; i < a.length(); i++) {
String secondaryListenNumber = a.optString(i);
list.add(secondaryListenNumber);
}
this.logger.logCatTxt(this.logger.getINFO(), this.LOG_TAG
+ ":getPrefs()", "List<String> with value(s)" + json
+ " retrieved from shared preferences: "
+ sharedPreferences + ", with key: " + key
+ ", type: " + Integer.toString(type)
+ " and context: " + context.toString());
// Return the list
return list;
} catch (JSONException e) {
e.printStackTrace();
this.logger.logCatTxt(this.logger.getERROR(), this.LOG_TAG
+ ":getPrefs()",
"Failed to retrieve List<String> from shared preferences: "
+ sharedPreferences + ", with key: " + key
+ ", type: " + Integer.toString(type)
+ " and context: " + context.toString(), e);
}
}
break;
default:
this.logger.logCatTxt(this.logger.getWARN(), this.LOG_TAG
+ ":getPrefs()",
"Unsupported data type was givien as parameter. Shared preferences: "
+ sharedPreferences + ", with key: " + key
+ ", type: " + Integer.toString(type)
+ " and context: " + context.toString());
}
// We should never reach this far but if we do an error has occurred and
// we return the ERROR string
return ERROR;
}
Run Code Online (Sandbox Code Playgroud)
是的,您的方法可以返回String:
return ERROR;
Run Code Online (Sandbox Code Playgroud)
宣告为String。
final String ERROR = "ERROR";
Run Code Online (Sandbox Code Playgroud)
此外,这大概会返回String:
return sharedPref.getString(key, (String) defaultObject);
Run Code Online (Sandbox Code Playgroud)
可能相关:
if (json != "") {
Run Code Online (Sandbox Code Playgroud)
请勿将字符串值与==或进行比较!=。使用String#equals,即
if (!json.equals("")) {
Run Code Online (Sandbox Code Playgroud)
甚至这个:
if (json.isEmpty()) {
Run Code Online (Sandbox Code Playgroud)
String如果有错误,在Java中返回错误不是一个好的设计。
Exception如果有错误,最好抛出某种形式,并让调用方法捕获异常并处理错误。
| 归档时间: |
|
| 查看次数: |
1318 次 |
| 最近记录: |