2016-05-05 236 views
-1

您好我已經通過Stackoverflow和谷歌搜索,我相信我的錯誤是我沒有發起變量電子郵件。但我無法確定我的錯誤在我的代碼中。任何幫助,將不勝感激。謝謝。java.lang.NullPointerException:嘗試調用虛擬方法'java.lang.String

我得到的錯誤是。

致命異常:主要過程:com.xxx.loginandregistration,PID:5821 顯示java.lang.NullPointerException:嘗試調用虛擬方法 「java.lang.String中com.xxx.loginandregistration.User.getEmail( )」上在 com.xxx.loginandregistration.LoginFragment $ 1.onResponse(LoginFragment.java:105) 一個 空對象引用在 retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall $ 1 $ 1.run(ExecutorCallAdapterFactory.jav ...:

我想我的錯誤是在我的loginPr使用方法,但我不確定我做錯了什麼。

private void loginProcess(String email,String password){ 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setEmail(email); 
     user.setPassword(password); 
     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.LOGIN_OPERATION); 
     request.setUser(user); 
     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       if(resp.getResult().equals(Constants.SUCCESS)){ 
        SharedPreferences.Editor editor = pref.edit(); 
        editor.putBoolean(Constants.IS_LOGGED_IN,true); 
        editor.putString(Constants.EMAIL,resp.getUser().getEmail()); 
        editor.putString(Constants.FIRSTNAME,resp.getUser().getFirstname()); 
        editor.putString(Constants.LASTNAME,resp.getUser().getLastname()); 
        editor.putString(Constants.UNIQUE_ID,resp.getUser().getUnique_id()); 
        editor.apply(); 
        goToProfile(); 

       } 
       progress.setVisibility(View.INVISIBLE); 
      } 

我完整的代碼

import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.design.widget.Snackbar; 
import android.support.v7.widget.AppCompatButton; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

/** 
* Created by hozda_000 on 4/19/2016. 
*/ 
public class LoginFragment extends Fragment implements View.OnClickListener { 

    private AppCompatButton loginButton; 
    private EditText emailEditText; 
    private EditText passwordEditText; 
    private TextView registerTextView; 
    private ProgressBar progress; 
    private SharedPreferences pref; 

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

     View view = inflater.inflate(R.layout.fragment_login, container,false); 
     initViews(view); 
     return view; 
    } 

    private void initViews(View view) { 
     pref = getActivity().getPreferences(0); 

     loginButton = (AppCompatButton)view.findViewById(R.id.loginButton); 
     registerTextView = (TextView)view.findViewById(R.id.registerTextView); 
     emailEditText = (EditText)view.findViewById(R.id.emailEditText); 
     passwordEditText = (EditText)view.findViewById(R.id.passwordEditText); 

     progress = (ProgressBar)view.findViewById(R.id.progress); 

     loginButton.setOnClickListener(this); 
     registerTextView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     switch(v.getId()) { 
      case R.id.registerTextView: 
       goToRegister(); 
       break; 

      case R.id.loginButton: 
       String email = emailEditText.getText().toString(); 
       String password = passwordEditText.getText().toString(); 

       if(!email.isEmpty() && !password.isEmpty()) { 
        progress.setVisibility(View.VISIBLE); 
        loginProcess(email, password); 
       } else { 
        Snackbar.make(getView(), "You have empty fields!", Snackbar.LENGTH_LONG).show(); 
       } 
       break; 
     } 
    } 

    private void loginProcess(String email,String password){ 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setEmail(email); 
     user.setPassword(password); 
     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.LOGIN_OPERATION); 
     request.setUser(user); 
     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       if(resp.getResult().equals(Constants.SUCCESS)){ 
        SharedPreferences.Editor editor = pref.edit(); 
        editor.putBoolean(Constants.IS_LOGGED_IN,true); 
        editor.putString(Constants.EMAIL,resp.getUser().getEmail()); 
        editor.putString(Constants.FIRSTNAME,resp.getUser().getFirstname()); 
        editor.putString(Constants.LASTNAME,resp.getUser().getLastname()); 
        editor.putString(Constants.UNIQUE_ID,resp.getUser().getUnique_id()); 
        editor.apply(); 
        goToProfile(); 

       } 
       progress.setVisibility(View.INVISIBLE); 
      } 


      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 

       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG, "failed"); 
       Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 

      } 
     }); 

    } 

    private void goToRegister(){ 
     Fragment register = new RegisterFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_frame, register); 
     ft.commit(); 
    } 

    private void goToProfile(){ 
     Fragment profile = new ProfileFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_frame, profile); 
     ft.commit(); 
    } 
} 
+0

'試圖調用虛擬方法java.lang.String中com.xxx.loginandregistration.User.getEmail( )'' - 你調用'getEmail()'的'User'實例爲null。由於您不會在附加代碼中的任何位置調用getEmail,因此您沒有在代碼中附加代碼。更正,它在這行'editor.putString(Constants.EMAIL,resp.getUser()。getEmail());'和'resp.getUser()'爲空 – Shark

+0

可能是您的ServerResponse .check中有空引用getUser()在響應中。 – Krish

回答

0

editor.putString(Constants.EMAIL,resp.getUser().getEmail());此行是導致錯誤。

對象從resp.getUser()返回的null所以調用null對象上getEmail()方法讓你NullPointerException

What is a NullPointerException, and how do I fix it?

+0

嗨,我能弄清楚我的錯誤。我錯過了我的PHP服務器代碼中的return語句。謝謝。 – hozdaman

相關問題