Android应用程序在运行时崩溃:’java.lang.String android.content.Context.getPackageName()’

我想知道是否有人可以提供帮助。 每次我运行我的Android应用程序项目时都会崩溃。 我把它缩小到一个单一的function,但我不知道它为什么会崩溃!

错误:

05-07 17:38:22.059 3952-3986/com.tfs.adihub W/System: ClassLoader referenced unknown path: /data/data/com.tfs.adihub/lib 05-07 17:38:22.122 3952-3952/com.tfs.adihub D/AndroidRuntime: Shutting down VM 05-07 17:38:22.123 3952-3952/com.tfs.adihub E/AndroidRuntime: FATAL EXCEPTION: main Process: com.tfs.adihub, PID: 3952 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tfs.adihub/com.tfs.adihub.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077) at android.app.ActivityThread.-wrap15(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference at android.content.ContextWrapper.getPackageName(ContextWrapper.java:133) at android.app.Activity.getLocalClassName(Activity.java:5205) at android.app.Activity.getPreferences(Activity.java:5239) at com.tfs.adihub.helpers.isLoggedIn(helpers.java:99) at com.tfs.adihub.MainActivity$override.onCreate(MainActivity.java:35) at com.tfs.adihub.MainActivity$override.access$dispatch(MainActivity.java) at com.tfs.adihub.MainActivity.onCreate(MainActivity.java:0) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077) at android.app.ActivityThread.-wrap15(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 05-07 17:38:30.716 3952-3952/com.tfs.adihub I/Process: Sending signal. PID: 3952 SIG: 9 

MainActivity.java:

 package com.tfs.adihub; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; public class MainActivity extends AppCompatActivity { /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; Button LoginButton, RegisterButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final helpers helpers = new helpers(); client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); Button LoginButton = (Button) findViewById(R.id.button_login); Button RegisterButton = (Button) findViewById(R.id.button_register); if (helpers.isLoggedIn()) { startActivity(new Intent(MainActivity.this, Dashboard.class)); } RegisterButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(MainActivity.this, Register.class)); } }); LoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(MainActivity.this, Login.class)); } }); } @Override public void onStart() { super.onStart(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. client.connect(); Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "Main Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.tfs.adihub/http/host/path") ); AppIndex.AppIndexApi.start(client, viewAction); } @Override public void onStop() { super.onStop(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "Main Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.tfs.adihub/http/host/path") ); AppIndex.AppIndexApi.end(client, viewAction); client.disconnect(); } } 

Login.Java:

 package com.tfs.adihub; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; import com.kosalgeek.asynctask.AsyncResponse; import com.kosalgeek.asynctask.PostResponseAsyncTask; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import static android.app.PendingIntent.getActivity; public class Login extends AppCompatActivity implements AsyncResponse { Button LoginSubmitButton, LoginRegisterButton; EditText LoginEmail, LoginPassword; /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); final helpers helpers = new helpers(); final EditText LoginEmail = (EditText) findViewById(R.id.login_email); final EditText LoginPassword = (EditText) findViewById(R.id.login_password); Button LoginSubmitButton = (Button) findViewById(R.id.login_submit); Button LoginRegisterButton = (Button) findViewById(R.id.login_register_button); LoginRegisterButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(Login.this, Register.class)); } }); assert LoginSubmitButton != null; LoginSubmitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final Context context = getApplicationContext(); int duration = Toast.LENGTH_SHORT; if (helpers.isEmpty(LoginEmail)) { CharSequence text = "Please enter your email address."; Toast toast = Toast.makeText(context, text, duration); toast.show(); } else { if (helpers.isEmpty(LoginPassword)) { CharSequence text = "Please enter your password."; Toast toast = Toast.makeText(context, text, duration); toast.show(); } else { if (helpers.isValidEmail(LoginEmail)) if (helpers.isValidPassword(LoginPassword)) { HashMap postData = new HashMap(); postData.put("emailaddress", LoginEmail.getText().toString()); postData.put("password", LoginPassword.getText().toString()); final PostResponseAsyncTask loginTask = new PostResponseAsyncTask(Login.this, postData, new AsyncResponse() { @Override public void processFinish(String s) { JSONObject results = null; String result_status = null; String MID = null; String MT = null; try { results = new JSONObject(s); result_status = results.getString("STATUS"); MID = results.getString("MID"); MT = results.getString("MT"); } catch (JSONException e) { e.printStackTrace(); } if (result_status.equalsIgnoreCase("success")) { SharedPreferences sharedPref = Login.this.getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("MID", MID); editor.putString("MTOK", MT); editor.commit(); startActivity(new Intent(Login.this, Dashboard.class)); } else { Context context = getApplicationContext(); int duration = Toast.LENGTH_SHORT; CharSequence text = result_status; Toast toast = Toast.makeText(context, text, duration); toast.show(); } } }); loginTask.execute("http://192.168.1.64/app/test.php"); } else { CharSequence text = "Invalid password."; Toast toast = Toast.makeText(context, text, duration); toast.show(); } else { CharSequence text = "Invalid email address."; Toast toast = Toast.makeText(context, text, duration); toast.show(); } } } } }); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); } @Override public void processFinish(String s) { } @Override public void onStart() { super.onStart(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. client.connect(); Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "Login Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.tfs.adihub/http/host/path") ); AppIndex.AppIndexApi.start(client, viewAction); } @Override public void onStop() { super.onStop(); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "Login Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.tfs.adihub/http/host/path") ); AppIndex.AppIndexApi.end(client, viewAction); client.disconnect(); } } 

Helpers.Java:

 package com.tfs.adihub; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Patterns; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; import com.kosalgeek.asynctask.AsyncResponse; import com.kosalgeek.asynctask.PostResponseAsyncTask; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Offic on 03/05/2016. */ public class helpers extends AppCompatActivity implements AsyncResponse { /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; boolean isEmpty(EditText etText) { return etText.getText().toString().trim().length() <= 0; } public boolean isValidEmail(EditText email) { if (TextUtils.isEmpty(email.getText())) { return false; } else { return Patterns.EMAIL_ADDRESS.matcher(email.getText()).matches(); } } public boolean isValidPassword(EditText password) { String regExpn = "^[a-z0-9_]{6,24}$"; CharSequence inputStr = password.getText(); Pattern pattern = Pattern.compile(regExpn, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(inputStr); if (matcher.matches()) { return true; } else { return false; } } private boolean verifySession(String MID, String MTOK) { HashMap postData = new HashMap(); postData.put("MID", MID); postData.put("MTOK", MTOK); final Boolean[] Ret = {false}; final PostResponseAsyncTask loginTask = new PostResponseAsyncTask(this, postData, new AsyncResponse() { @Override public void processFinish(String s) { JSONObject results = null; String result_status = null; try { results = new JSONObject(s); result_status = results.getString("STATUS"); } catch (JSONException e) { e.printStackTrace(); } if (result_status == "success") { Ret[0] = true; } else { Ret[0] = false; } } }); loginTask.execute("http://192.168.1.64/app/test.php"); return Ret[0]; } public boolean isLoggedIn() { SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE); String MID = sharedPref.getString("MID", null); String MT = sharedPref.getString("MTOK", null); if (MID == null || MT == null) { return false; } else { return verifySession(MID, MT); } } @Override public void processFinish(String s) { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); } @Override public void onStart() { super.onStart(); client.connect(); Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "helpers Page", // TODO: Define a title for the content shown. Uri.parse("http://host/path"), Uri.parse("android-app://com.tfs.adihub/http/host/path") ); AppIndex.AppIndexApi.start(client, viewAction); } @Override public void onStop() { super.onStop(); Action viewAction = Action.newAction( Action.TYPE_VIEW, // TODO: choose an action type. "helpers Page", // TODO: Define a title for the content shown. // TODO: If you have web page content that matches this app activity's content, // make sure this auto-generated web page URL is correct. // Otherwise, set the URL to null. Uri.parse("http://host/path"), // TODO: Make sure this auto-generated app URL is correct. Uri.parse("android-app://com.tfs.adihub/http/host/path") ); AppIndex.AppIndexApi.end(client, viewAction); client.disconnect(); } } 

任何帮助将不胜感激! 我对这种语言非常非常新,所以我仍然要掌握这一切是如何运作的。

非常感谢

您的设计存在一个重大缺陷。 错误很明显。 在这一行

 final helpers helpers = new helpers(); 

你试图创建一个活动的对象,这是一个非常非常糟糕的做法。 您不能简单地创建这样的活动对象。 Android中的所有活动都必须通过活动生命周期,以便它们附加有效的上下文。 在这种情况下,有效的上下文不会附加到帮助程序实例。 所以结果就行了

 SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE); 

导致空指针,因为’this’为空。 (为什么?因为这是指由于未使用startActivity(intent)启动活动而尚未创建的上下文)

另一件事虽然这不是错误,但您必须使用以大写字母开头的活动名称。 这是遵循的惯例,将使您的代码更具可读性。 由于大写和小写名称的奇怪使用,您的代码非常混乱。 您使用小写字母声明您的类,而在某些地方,变量是大写的。 这会造成混乱。 规则是类,接口等应以大写字母和变量作为小写字母开头。

所以在这种情况下你做什么?

您永远不会开始您的Helper活动,我认为您不需要向用户显示它。 这就是它需要在没有用户交互的情况下完成一些工作。 你应该把它变成一种服务。 然后使用startService(intent).启动它startService(intent). 或者您也可以将其创建为Java类,具体取决于您的用例。

编辑:顺便说一句,我回答了另一个类似的问题,但问题相同,但今天晚些时候涉及服务。