2017-06-16 12 views
0

Ich verwende die statische Klasse, die Sie hier finden können, aber aus irgendeinem Grund, wenn ich die Klasse getEmail() {... Methode I erhalten Ausnahme:Java Android - private Konstruktor in einer statischen Klasse ruft nicht

java.lang.RuntimeException: Kann Aktivität ComponentInfo {com.techsolutions.appgrade/com.techsolutions.appgrade.View.RegisterActivity} starten: java.lang.NullPointerException: Versuch zum aufrufen Interface-Methode ‚boolean android .content.SharedPreferences.contains (java.lang.String) 'bei einem Nullobjekt-Verweis

Es sieht so aus, als ob der private Konstruktor keinen Anruf erhält ed.

Dies ist meine statische Klasse:

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 ""; 
    } 
} 

und das ist, wie ich die Methode von einer anderen Klasse genannt:

DataController.setEmail(email) 
+0

Im Beispiel wird keine statische Klasse angezeigt. –

Antwort

2

Sie sind nicht Ihre Konstruktor aufrufen. Ihr Konstruktor ist privat. Es kann nicht von außerhalb Ihrer Klasse angerufen werden. Sie versuchen, ein Singleton zu erstellen. Sie haben Ihre newInstance-Methode in Ihrem Singleton vergessen.

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

Danach können Sie

DataController dataController = DataController.newInstance(); 

rufen Sie Ihre Klasse zu initialisieren, oder eine bestehende Instanz der Klasse bekommen.

Auch ich würde nicht empfehlen, Ihre Anwendungsklasse in diesem Fall zu erweitern, nur weil Sie auf den Kontext zugreifen müssen. Sie können eine Kontextvariable hinzufügen, die Sie festlegen können, nachdem Sie die Methode newInstance aufgerufen haben.

0
public static DataController instance; 

Müssen Sie eine statische Klasse initialisieren?

Verwandte Themen