Pravinsingh Waghela
Pravinsingh Waghela

Reputation: 2534

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...

Upvotes: 2

Views: 6074

Answers (2)

Prajwal Waingankar
Prajwal Waingankar

Reputation: 2710

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.

Upvotes: 2

Turo
Turo

Reputation: 4914

Code Snippet of SharedPreferencesImpl:

public long getLong(String key, long defValue) {
    synchronized (mLock) {
        awaitLoadedLocked();
        Long v = (Long)mMap.get(key); 
        return v != null ? v : defValue;
    }
}

so presumably there is an Integer in the map.

If you need a Long try

try {
    return settings.getLong(key, def);
}
catch (ClassCastException e) {
    int val = settings.getInt(key,0);
    return (val == 0) ? def : Long.valueOf(val);
}

Edit: this will fail if the map contains 0, def will be returned, no problem in your case, but...

Upvotes: 1

Related Questions