Android SharePreference 的類型錯誤(java.lang.ClassCastException)

在做Android項目時,使用了SharePreference保存用戶登錄狀態和一些字段信息。由於需要在進入用戶模塊時進行登錄狀態判斷及信息載入,寫了一個checkUserstate的函數,主要是抽取SP中的信息,判斷用戶是否已登錄。

此部分最開始我設想使用一個布爾型的flag進行登錄判斷,在沒完成具體業務的時候,預先寫了一個flag,並使用SP.getBoolean(“”,false),獲得存儲的登陸標誌。

在完成了註冊和登錄業務後,準備具體調試這個用戶模塊,由於考慮到具體的業務實現,界面的載入被劃分爲三種情況,因此我改寫了flag爲int型,以方便進行判斷。此時,我改寫了所有的SP.getBoolean爲SP.getInt,並將涉及到的所有SP關係都重寫修改了。

改寫完登錄狀態驗證後,重新進行測試。此測試,SP還未寫入任何數據,因此getInt和其他方法都應得到缺省值。

此時,系統報了一個java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Integer 錯誤。

這個錯誤也算是比較常見,但定位到的是getInt(“login”,0),提示該方法返回了Boolean型。

以下是我的調試步驟:

1.進行debug,但運行到getInt方法後,直接報錯跳出,且無法顯示getInt返回值。

2.改寫爲Boolean flag=SP.getInt(“login”,0),系統提示類型錯誤

3.檢查了在getInt前,確定未進行任何SP的寫入操作

判斷:

根據之前SQLite的使用經驗,判斷可能是SP的“login”預先寫入了值,因此getInt方法獲得了返回(不是缺省值0),由於一些系統的Boolean型認爲,false和0是可以對應的,所以getInt把“login”的false值返回了。

爲什麼“login”鍵值對有值呢?我認爲可能是我之前執行getBoolean(“login”,false)時,雖然沒有對SP進行寫入(從未執行過SP寫入),但get方法返回缺省值的同時,給“login”寫入了缺省值造成的。

解決:

主要是刪除數據庫和SP。

由於SP和SQLite都是跟隨APP存在的,此時,只有在模擬器上手動卸載APP,才能保證數據庫和SP被清除。

完成卸載後,重新安裝運行APP,果然成功通過了。


PS:本寶寶心好累……

發佈了30 篇原創文章 · 獲贊 27 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章