Search code examples
javaandroidsharedpreferencesclasscastexception

ClassCastException java.lang.Integer cannot be cast to java.lang.Long on getting the Shared Preference value


I am getting

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

exception on getting the Shared Preference default value if value is not present in preference. Below is my code.

public long getLongSharedValue(String key, long def) {
        SharedPreferences settings = context.getSharedPreferences(
                context.getApplicationInfo().packageName + "_prefs", Context.MODE_PRIVATE);
        return settings.getLong(key, def); // Error is logged here...
    }

Can anyone help me in resolving the issue. I had tried converting forceful typecasting as well as shown below:

return settings.getLong(key, Long.valueOf(def));

but still getting the issue.

The Error Log is as below:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
        at android.app.SharedPreferencesImpl.getLong(SharedPreferencesImpl.java:249)
        at package-name.UtilityClass.getLongSharedValue(UtilityClass.java:104)
        at package-name.Fragment1.getPullData(Fragment1.java:130)
        at package-name.Fragment1.onCreateView(Fragment1.java:107)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

I am using the method in my app as :

    long id = mUtility.getLongSharedValue(Constants.SharedPreferencesKeys.USER_ID, 0);
//long id = mUtility.getLongSharedValue(Constants.SharedPreferencesKeys.USER_ID, 0L); // Tried this as well but same issue is perishing...

Solution

  • When u r passing value to this getLongSharedValue(String, long) make sure that the second parameter value you are passing is a long datatype value.

    Because Long.valueOf() accepts mostly two parameter type either string or long.

    Since, its not working for u seems that the value passed to the getLongSharedValue(String, long) second parameter is not a long value.