Java 将对象强制转换为列表时的ClassCastException<;字符串>;
我正在开发和Android应用程序,我已经实现了一个类,用于处理所有共享首选项。这个类拥有一个获取首选项的通用方法,它的通用性在于它根据参数返回不同类型的数据类型。我存储到共享pref并从中检索的数据类型有integer、string、boolean和List(使用JSON将List序列化/反序列化为字符串)。 好吧,一切都很好,我可以通过这种方式成功地从共享首选项中获取int、string和boolean,但不能获取列表,因为我得到了一个:Java 将对象强制转换为列表时的ClassCastException<;字符串>;,java,android,classcastexception,Java,Android,Classcastexception,我正在开发和Android应用程序,我已经实现了一个类,用于处理所有共享首选项。这个类拥有一个获取首选项的通用方法,它的通用性在于它根据参数返回不同类型的数据类型。我存储到共享pref并从中检索的数据类型有integer、string、boolean和List(使用JSON将List序列化/反序列化为字符串)。 好吧,一切都很好,我可以通过这种方式成功地从共享首选项中获取int、string和boolean,但不能获取列表,因为我得到了一个: java.lang.ClassCastExcepti
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List
我忘了告诉你方法被声明为返回一个对象,当它被调用时,返回的值被类型转换为正确的类型。
无论如何,我不明白为什么它说不能转换字符串,它甚至不返回字符串?这是一个正确的方法吗,我的意思是返回一个对象,然后投射它是完全正确的
下面是获取共享首选项的完整方法。谢谢你的建议
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;
}
公共对象getPrefs(字符串共享引用、字符串键、int类型、,
上下文,对象(默认对象){
//一个字符串,指示检索共享时出错
//偏好
最后一个字符串ERROR=“ERROR”;
//从上下文设置共享首选项
sharedPref=context.getSharedPreferences(sharedPreferences,
上下文。模式(私人);
开关(类型){
案例(0)://您正在使用非相等运算符比较字符串:
if(json!=”)
您应该使用if(!“”.equals(json))
如果json为空,则返回一个字符串错误。如果尝试强制转换到列表,则会导致异常。是,您的方法可以返回一个
字符串:
return ERROR;
return sharedPref.getString(key, (String) defaultObject);
它被声明为字符串
final String ERROR = "ERROR";
此外,这可能会返回一个字符串
:
return ERROR;
return sharedPref.getString(key, (String) defaultObject);
可能相关:
if (json != "") {
不要将字符串值与=
或!=
进行比较。使用string#equals
,即
if (!json.equals("")) {
甚至这个:
if (json.isEmpty()) {
在Java中,如果出现错误,则返回错误字符串
,这不是一个好的设计
如果出现错误,最好抛出某种类型的异常
,并让调用方法捕获异常并处理错误
java.lang.String cannot be cast to java.util.List
错误字符串表示:您正试图将字符串强制转换为列表。
使用调试器找到它。如果返回类型是对象
,则在转换到另一个类型时使用InstanceOf
是一个好主意。正如前面提到的,不要返回错误字符串,最好抛出一个异常您发布了太多的代码。发生错误的原因是您试图分配一个字符串
到一个列表
。对此我很抱歉。有时代码太少,有些代码太多。从错误中不难找出错误发生的原因,问题是我没有找到字符串的来源…我现在觉得很愚蠢,因为我没有更早地捕捉到它…我将重构metod以抛出一个异常如果有错误而不是字符串,则启用。