【问题标题】:Java android - private constructor in a static class doesn't get calledJava android - 静态类中的私有构造函数不会被调用
【发布时间】:2017-06-16 20:48:17
【问题描述】:

我正在使用您可以在下面找到的静态类, 但是由于某种原因,当我使用类 getEmail(){... 方法时,我得到了异常:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.techsolutions.appgrade/com.techsolutions.appgrade.View.RegisterActivity}:java.lang.NullPointerException:尝试调用接口方法'boolean android.content.SharedPreferences .contains(java.lang.String)' 在空对象引用上

看起来私有构造函数没有被调用。

这是我的静态类:

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)

【问题讨论】:

  • 示例中没有显示静态类。

标签: java android static singleton


【解决方案1】:

你没有调用你的构造函数。您的构造函数是私有的。不能从课堂外调用它。您正在尝试创建一个单例。您忘记了单例中的 newInstance 方法。

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

之后你可以调用

DataController dataController = DataController.newInstance();

初始化您的类,或获取您的类的现有实例。

另外,我不建议在这种情况下扩展您的应用程序类,因为您需要能够访问上下文。 您可以添加一个 Context 变量,您可以在调用 newInstance 方法后设置该变量。

【讨论】:

    【解决方案2】:
    public static DataController instance;
    

    你需要初始化一个静态类吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2017-11-23
      相关资源
      最近更新 更多