2017-05-25 29 views
-2

我一直在鍵盤上敲打我的頭幾個小時。我想在我的應用程序中爲單獨的統計活動存儲遞增的整數。我正在嘗試使用共享首選項來實現此目的。然而,在我最近的嘗試中,這是我得到的最遠的一次,程序拋出一個異常。帶SharedPreferences的空對象引用

我的代碼:

public class LootChest extends AppCompatActivity { 
    public static final String prefName = "prefsFile"; 
    SharedPreferences settings = getApplicationContext().getSharedPreferences(prefName, 0); //line 25 
    int rollCountS = settings.getInt("Roll Count", 0); 
    int rollCount = 0; //to be incremented 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loot_chest); 
    } 

    public void openChest(View v) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt("Roll Count", rollCount); 
     rollCount = rollCountS + 1; 

例外:

Caused by: java.lang.NullPointerException: 
Attempt to invoke virtual method 
'android.content.SharedPreferences android.content.Context 
.getSharedPreferences(java.lang.String, int)' 
on a null object reference at android.content.ContextWrapper 
.getSharedPreferences(ContextWrapper.java:171) 
at net.zingrook.mobiloot.LootChest.<init>(LootChest.java:25) 

我已經在實施這項閱讀幾十個線程,看着Android的文檔和我的想法。感謝您的任何幫助。

+0

點我不是一個Android程序員,但如果問題是上下文包裝是在類實例化空,它是可能的設置應該在調用onCreate之後? – KevinO

回答

1

只需以此方式更改此代碼即可。

public class LootChest extends AppCompatActivity { 
    public static final String prefName = "prefsFile"; 
    SharedPreferences settings; //line 25 
    int rollCountS; 
    int rollCount = 0; //to be incremented 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loot_chest); 
     settings = getApplicationContext().getSharedPreferences(prefName, 0); 
     rollCountS = settings.getInt("Roll Count", 0); 
    } 
4

您正在初始化sharedPreference對象,然後才能開始活動生命週期。

初始化進入onCreate

public static final String prefName = "prefsFile"; 
    SharedPreferences settings; //line 25 
    int rollCountS; 
    int rollCount = 0; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loot_chest); 
     settings = getApplicationContext().getSharedPreferences(prefName, 0); 
    } 
0

我的觀點

public class LootChest extends AppCompatActivity { 
public static final String prefName = "prefsFile"; 
SharedPreferences settings; 
SharedPreferences.Editor editor; 
int rollCountS; 
int rollCount = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_loot_chest); 
    settings=getApplicationContext().getSharedPreferences(prefName, 0); 
    editor = settings.edit(); 
    rollCountS= settings.getInt("Roll Count", 0); 
} 

public void openChest(View v) { 
    editor.putInt("Roll Count", rollCount); 
    rollCount = rollCountS + 1;