错误:在空对象引用上

我不知道我的代码有什么问题

这是我的Fragment类

package com.example.gandi.symanlub; /** * A simple {@link Fragment} subclass. */ public class Reminder extends Fragment { Button btnubah, btnkeluar; SessionManager session; View rootview; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment rootview = inflater.inflate(R.layout.fragment_reminder, container, false); btnkeluar = (Button)rootview.findViewById(R.id.btnlogout); btnkeluar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { session.logoutUser(); } }); return rootview; } } 

这是我的SessionManager.java

 package com.example.gandi.symanlub; @SuppressLint("CommitPrefEdits") public class SessionManager { // Shared Preferences SharedPreferences pref; // Editor for Shared preferences SharedPreferences.Editor editor; // Context Context _context; // Shared pref mode int PRIVATE_MODE = 0; // nama sharepreference private static final String PREF_NAME = "Sesi"; // All Shared Preferences Keys private static final String IS_LOGIN = "IsLoggedIn"; public static final String KEY_EMAIL = "email"; public static final String KEY_PASS = "pass"; // Constructor public SessionManager(Context context){ this._context = context; pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); editor = pref.edit(); } /** * Create login session * */ public void createLoginSession(String email, String pass){ // Storing login value as TRUE editor.putBoolean(IS_LOGIN, true); editor.putString(KEY_EMAIL, email); editor.putString(KEY_PASS, pass); editor.commit(); } /** * Check login method wil check user login status * If false it will redirect user to login page * Else won't do anything * */ public void checkLogin(){ // Check login status if(!this.isLoggedIn()){ Intent i = new Intent(_context, Login.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); _context.startActivity(i); //((Activity)_context).finish(); } } /** * Get stored session data * */ public HashMap getUserDetails(){ HashMap user = new HashMap(); user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null)); user.put(KEY_PASS, pref.getString(KEY_PASS, null)); return user; } /** * Clear session details * */ public void logoutUser(){ editor.clear(); editor.commit(); } public void hapussesi(){ editor.clear(); editor.commit(); } public boolean isLoggedIn(){ return pref.getBoolean(IS_LOGIN, false); } } 

运行项目时的错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚方法’void com.example.gandi.symanlub.SessionManager.logoutUser()’

你收到一个错误,因为在这一行你正在打电话:

 session.logoutUser(); 

session是null,因为它没有在任何地方初始化。 在使用它之前,您需要添加一行来初始化它(您可以在onCreateView ,或在onAttach或您认为合适的任何地方):

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { session = new SessionManager(getActivity()); 

getActivity用于将Context传递给构造函数,因为我看到它接受了该参数。

把它放在onCreate()中:

  session = new SessionManager(getActivity());