【问题标题】:Attempt to invoke virtual method on a Null object reference [duplicate]尝试在 Null 对象引用上调用虚拟方法 [重复]
【发布时间】:2016-01-12 10:05:52
【问题描述】:

我创建了一个登录并尝试保存用户名和用户 ID 会话,但我在这一行遇到错误

mAppPreference.setUserID(userid);

错误是:-

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.mivas.AppContoller.AppPreference.setUserID(java.lang.String)' on a null object reference

这是我的登录类

公共类 LoginPagefrag 扩展 Fragment 实现 OnClickListener、MiFeelingBase {

private Intent i;
private int urlIndex=0;
private Button btnLogin;
private EditText edUserName,edPassword;
private String strUserName,strPassword;
private String strEmailID;
private MultipartEntity reqEntity;
private Dialog dialog;
private ProgressDialog pDialog;
Context cxt;
private SessionManager session;
SharedPreferences myPriference;
AppPreference mAppPreference;

public static final String TAG_USERID = "userid";
public static String TAG_USERNAME = "username";


private static final Pattern EMAIL_PATTERN = Pattern.compile("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.loginpage, container, false);

    APIAccess.fetchData(LoginPagefrag.this, getActivity(), getActivity());

    btnLogin=(Button)rootView.findViewById(R.id.btnLogin);
    edUserName=(EditText)rootView.findViewById(R.id.edUserName);
    edPassword=(EditText)rootView.findViewById(R.id.edPassword);


   btnLogin.setOnClickListener(this);

   return rootView;

}
@SuppressWarnings("unused")
private void initialiseNoramlVariable() {

    cxt = getActivity();

    mAppPreference = AppPreference.getInstance(cxt);    

}

public void postLogin()
{
    try
    {
     StringBody username=new StringBody(strUserName);
     StringBody password=new StringBody(strPassword);


    reqEntity = new MultipartEntity();

    reqEntity.addPart("username", username);
    reqEntity.addPart("password", password);

    }
    catch(Exception e)
    {
        System.out.println("err" + e);
    }

}

public void postForgotPass()
{
    try
    {
     StringBody emailid=new StringBody(strEmailID);


    reqEntity = new MultipartEntity();

    reqEntity.addPart("email", emailid);

    }
    catch(Exception e)
    {
        System.out.println("err" + e);
    }

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId())
    {

    case R.id.btnLogin :
        if(edUserName.getText().toString().equalsIgnoreCase(""))
        {
        //  Toast.makeText(LoginPagefrag.this, "enter username", Toast.LENGTH_SHORT).show();
        }else if(edPassword.getText().toString().equalsIgnoreCase(""))
        {
            //Toast.makeText(LoginPagefrag.this, "enter pass", Toast.LENGTH_SHORT).show();
        }else
        {
            strUserName=edUserName.getText().toString();
            strPassword=edPassword.getText().toString();
            urlIndex=0;
             APIAccess.fetchData(LoginPagefrag.this, getActivity(), getActivity());
        }
        break;
    }
}


@Override
public String httpPost() {
    // TODO Auto-generated method stub
    String response="";
    if(urlIndex==0)
    {
    postLogin();
    response=APIAccess.openConnection(StaticData.SABAKUCH_LOGIN, reqEntity);

    }
    return response;
}

@Override
public String httpAfterPost(String str) {
    // TODO Auto-generated method stub
    if(str!=null)
    {
        if(urlIndex==0)
        {
        if(SabaKuchParsechat.jsonStatus(str)==0)
        {
        //  Toast.makeText(LoginPagefrag.this, SabaKuchParsechat.jsonErrorMessage(str), Toast.LENGTH_SHORT).show();
        }

        else if(SabaKuchParsechat.jsonStatus(str)==1)
        {

            LoginData obj=SabaKuchParsechat.parseLoginData(str);

            Log.d("objj", "hello"+obj);

            String userid = obj.strUserId;              
            String username= obj.strUserName;

            mAppPreference.setUserID(userid);
            mAppPreference.setUserName(username);
            mAppPreference.setServerKey();

            session.setLogin(true);

            Intent iintt =  new Intent(getActivity(),MainActivity.class);
            startActivity(iintt);



        }
        }
    }
    return null;
}
private boolean CheckEmail(String email) {

    return EMAIL_PATTERN.matcher(email).matches();

}
public ConnectivityManager getSystemService(String connectivityService) {
    // TODO Auto-generated method stub
    return null;
}

}

这是我的 AppPreference 类:-

public class AppPreference extends Application {

Context cxt;

private static final String SHARED_APP_PREFERENCE_NAME = "sabakuchapp_pref_key";
public static AppPreference mAppprefernce;
private SharedPreferences pref;
private Editor mEditor;



public AppPreference() {
    super();
    // TODO Auto-generated constructor stub
}

enum SharedPreferenceKey{
    USER_ID, USER_NAME, SERVER_KEY;
}

private AppPreference (Context context){
    pref = context.getSharedPreferences(SHARED_APP_PREFERENCE_NAME, Context.MODE_PRIVATE);
    mEditor = pref.edit();
}



public AppPreference(Context cxt, SharedPreferences pref, Editor mEditor) {
    super();
    this.cxt = cxt;
    this.pref = pref;
    this.mEditor = mEditor;
}


public static AppPreference getInstance(Context context){
    if(mAppprefernce == null){
        mAppprefernce = new AppPreference(context);
    }
    return  mAppprefernce;
}

public void setUserID(String id){
    mEditor.putString(SharedPreferenceKey.USER_ID.toString(), id);
    mEditor.commit();
}

public String getUserID(){
    return pref.getString(SharedPreferenceKey.USER_ID.toString(), "");
}

public void setUserName(String name){
    mEditor.putString(SharedPreferenceKey.USER_NAME.toString(), name);
    mEditor.commit();
}

public String getUserName(){
    return pref.getString(SharedPreferenceKey.USER_NAME.toString(), "");
}

public void setServerKey(){

    String original = getUserID()+"_" + getUserName() + "_SBK";
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("MD5");
        md.update(original.getBytes());
        byte[] digest = md.digest();
        StringBuffer sb = new StringBuffer();
        for (byte b : digest) {
            sb.append(String.format("%02x", b & 0xff));
        }
        mEditor.putString(SharedPreferenceKey.SERVER_KEY.toString(), sb.toString());
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        mEditor.putString(SharedPreferenceKey.SERVER_KEY.toString(), "");
    }       
    mEditor.commit();
    return;
}

public String getServerKey(){
    return pref.getString(SharedPreferenceKey.SERVER_KEY.toString(), "");
}

}

请让我知道我在这里缺少什么。提前致谢。

【问题讨论】:

  • 好吧,否定标记先生。请解决这个问题并告诉我为什么要标记为负数,或者当您看到 NULLPOINTER 时标记为负数只是一种时尚????
  • 见 Selvin,请帮我一个忙,首先尝试阅读我的完整问题,
  • 请帮大家一个忙,阅读“什么是空指针异常,我该如何解决?” ...您永远不会分配 mAppPreference 并询问您为什么要获得 NPE ...
  • @Devraj:你是来寻求帮助的,请不要这么粗鲁。你可以看到我对你的问题的回答。
  • @Rohit5k2 是的,兄弟,我正在尝试您的解决方案,我对我的话感到非常抱歉。但是当有些人在阅读问题之前只是标记为否定时感觉不好。我已经提到过,请让我知道我在这里缺少什么。无论如何,如果我听起来很粗鲁,我真的很抱歉。

标签: android nullpointerexception sharedpreferences


【解决方案1】:
@SuppressWarnings("unused")
private void initialiseNoramlVariable() {

    cxt = getActivity();

    mAppPreference = AppPreference.getInstance(cxt);    

}

您自己添加了"unused" 警告。事实上,你从来没有调用过这个方法。所以mAppPreferencenull。如果此方法无效,请将mAppPreference = AppPreference.getInstance(cxt); 移动到其他位置,例如onCreateView,以确保可以启动它。

【讨论】:

    【解决方案2】:

    您需要初始化变量mAppPreference

    我的意思是你已经在方法initialiseNoramlVariable() 中做到了,但从未调用过该方法。你应该调用onCreateView()中的方法

    【讨论】:

      【解决方案3】:

      您没有调用 initialiseNoramlVariable 方法,因此 mAppPreference 没有被初始化。

      这应该可以帮助您:

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
      
          View rootView = inflater.inflate(R.layout.loginpage, container, false);
      
          APIAccess.fetchData(LoginPagefrag.this, getActivity(), getActivity());
      
          btnLogin=(Button)rootView.findViewById(R.id.btnLogin);
          edUserName=(EditText)rootView.findViewById(R.id.edUserName);
          edPassword=(EditText)rootView.findViewById(R.id.edPassword);
      
          btnLogin.setOnClickListener(this);
      
          cxt = getActivity();
          mAppPreference = AppPreference.getInstance(cxt); 
      
          return rootView;
      }   
      

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 2023-03-13
        • 1970-01-01
        • 2016-07-30
        • 2015-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多