Android java.lang.Long 无法转换为 java.lang.String
Posted
技术标签:
【中文标题】Android java.lang.Long 无法转换为 java.lang.String【英文标题】:Android java.lang.Long cannot be cast to java.lang.String 【发布时间】:2021-09-12 19:58:47 【问题描述】:好的,所以我使用
在我的共享首选项中存储了很长的内容e.putLong("startTime", SystemClock.uptimeMillis());
我是从分享偏好中得到的,比如
SHARED_PREFS = context.getSharedPreferences(LOCAL_PREF, MODE_PRIVATE);
long startTime = SHARED_PREFS.getLong("startTime", 0L); <-- Stack trace points to this line.
但我在某些设备上收到此错误,但不知道为什么,我根本不想将其转换为 String
。
java.lang.Long cannot be cast to java.lang.String
我发现的所有内容都指向尝试将其设置为 String
值,而我根本不想这样做,我正在尝试直接使用 long
值。
** 更新堆栈跟踪 **
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:255)
at com.tech.utility.Tools.refreshPrefs(Tools.java:193)
at com.tech.activity.Menu_dashboard.onStart(Menu_dashboard.java:762)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1340)
at android.app.Activity.performStart(Activity.java:7191)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6940)
at java.lang.reflect.Method.invoke(Method.java:-2)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
【问题讨论】:
@Carcigenicate 我更新了我的堆栈跟踪。 【参考方案1】:如果您要使用read the docs,您会读到getLong
方法将:
如果此名称的首选项不长,则抛出 ClassCastException。
所以,在应用程序的其他地方,您一定调用过:
e.putLong("startTime", "someString");
【讨论】:
哈哈.. 领先我 10 秒 ;) 我只在整个应用程序中设置了一次,也就是我创建计时器的时候,之后它只与getLong
一起使用
@MarkKeen at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:255)
不是我的文件之一,之前的行是 startTime = SHARED_PREFS.getLong("startTime", 0L);
,所以我不确定它为什么会尝试以 String
的身份访问它
可能您在应用程序的早期版本中设置了一些内容,并且设置仍然存在?你可以试试: A. 使用不同的变量名。 B. 卸载应用或清除所有应用数据,然后重试。
@user2101081 - 不是它的 AOSP 代码,它在运行时解析/调用,它不是公共 SDK 的一部分,它具有调用此代码的 SharedPreferences API。请参阅android.googlesource.com/platform/frameworks/base.git/+/master/… - SharedPreferencesImpl 拥有一个 Map<String, Object>
,它只是根据请求的类型进行转换。只需在设置中清除应用中的数据/缓存,然后重试【参考方案2】:
这有点晚了,但是对于那些仍然面临这个问题的人,只需在调用 get 方法之前用你需要的类型的值覆盖 SharedPreferences 中的这个值。也许之前在那里写过一个字符串(或其他类型)
【讨论】:
以上是关于Android java.lang.Long 无法转换为 java.lang.String的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.ClassCastException:java.lang.Long 无法在 java 1.6 中转换为 java.lang.Integer
如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;
ClassCastException:java.math.BigInteger 在连接到 MySQL 时无法转换为 java.lang.Long
无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上