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&lt;String, Object&gt;,它只是根据请求的类型进行转换。只需在设置中清除应用中的数据/缓存,然后重试【参考方案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 帖子上

java long和java.lang.Long有啥区别?

java.lang.Integer can not be cast to java.lang.Long