2017-06-16 59 views
0

我使用的靜態類,你可以在這裏找到, ,但由於某種原因,當我使用類getEmail(){...方法I獲取異常:Java的Android - 靜態類中的私人構造函數不會被調用

java.lang.RuntimeException:無法啓動活動ComponentInfo {com.techsolutions.appgrade/com.techsolutions.appgrade.View.RegisterActivity}:java.lang.NullPointerException:試圖調用接口方法boolean android .content.SharedPreferences.contains(java.lang.String)'on null object引用

它看起來像私人構造函數沒有得到調用編輯。

這是我的靜態類:

package com.techsolutions.appgrade.Logic; 

import android.app.Activity; 
import android.app.Application; 
import android.content.Context; 
import android.content.SharedPreferences; 

import org.apache.commons.validator.routines.EmailValidator; 

public final class DataController extends Application{ 

    private static SharedPreferences sharedPref; 
    private static SharedPreferences.Editor editor; 
    private static Context context; 

    private static boolean isRegistered; 

    private static String PREF_NAME = "StudentSharedPref"; 
    private static String KEY_Name = "name"; 
    private static String KEY_Email = "email"; 
    private static String KEY_PhoneNum = "phoneNum"; 
    private static String KEY_Age = "age"; 
    private static String KEY_Realm = "age"; 

    public static DataController instance; 

    private DataController() 
    { 
     System.out.println("Been HERE"); 
     sharedPref = context.getSharedPreferences(PREF_NAME, Activity.MODE_PRIVATE); 
     editor = sharedPref.edit(); 
     context = getApplicationContext(); 

     isRegistered = false; 
    } 

    public static void setName(String name) 
    { 
     editor.putString(KEY_Name, name); 
     editor.apply(); 
    } 

    public static String getName(){ 
     if(sharedPref.contains(KEY_Name)) 
     { 
      return sharedPref.getString(KEY_Name, ""); 
     } 
     return ""; 
    } 

    public static boolean setEmail(String email) 
    { 
     if(!EmailValidator.getInstance().isValid(email)) 
      return false; 

     editor.putString(KEY_Email, email); 
     editor.apply(); 
     return true; 
    } 

    public static String getEmail(){ 
     if(sharedPref.contains(KEY_Email)) 
     { 
      return sharedPref.getString(KEY_Email, ""); 
     } 
     return ""; 
    } 

    public static boolean setPhonNum(String phoneNum) 
    { 
     if(String.valueOf(phoneNum).length() == 10) 
      return false; 

     editor.putString(KEY_PhoneNum, phoneNum); 
     editor.apply(); 
     return true; 
    } 

    public static String getPhoneNum(){ 
     if(sharedPref.contains(KEY_PhoneNum)) 
     { 
      return sharedPref.getString(KEY_PhoneNum, ""); 
     } 
     return ""; 
    } 

    public static boolean setAge(int age) 
    { 
     if(age <= 0 || age>120) 
      return false; 

     editor.putInt(KEY_Age, age); 
     editor.apply(); 
     return true; 

    } 

    public static String getAge(){ 
     if(sharedPref.contains(KEY_Age)) 
     { 
      return sharedPref.getString(KEY_Age, ""); 
     } 
     return ""; 
    } 

    public static void setRealm(String realm) 
    { 
     editor.putString(KEY_Realm, realm); 
     editor.apply(); 
    } 

    public static String getRealm(){ 
     if(sharedPref.contains(KEY_Realm)) 
     { 
      return sharedPref.getString(KEY_Realm, ""); 
     } 
     return ""; 
    } 
} 

,這是我怎麼叫從另一個類中的方法:

DataController.setEmail(email) 
+0

示例中沒有顯示靜態類。 –

回答

2

你是不是叫你的構造。你的構造函數是私人的。它不能從你的課堂以外被調用。你正在嘗試創建一個單身人士。你在單例中忘記了你的newInstance方法。

public static DataController newInstance(){ 
    if(instance == nul){ 
     instance = new DataController(); 
    } 
    return instance; 
} 

在此之後,你可以調用

DataController dataController = DataController.newInstance(); 

初始化類,或讓你的類的現有實例。

另外我不會推薦擴展你的應用程序類在這種情況下,只是因爲你需要能夠訪問上下文。 您可以添加一個Context變量,您可以在調用newInstance方法後設置該變量。

0
public static DataController instance; 

你需要初始化一個靜態類嗎?