问题
笔者使用java开发android程序,控制台报错
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.assistingagriculture/com.example.assistingagriculture.activity.care_model.ChangePasswordActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
详细问题
笔者核心代码
import android.os.Bundle;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.example.assistingagriculture.R;
public class ChangePasswordActivity extends AppCompatActivity {
EditText editText = findViewById(R.id.editText);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_password);
}
}
控制台详细报错
2024-02-13 13:38:49.642 17547-17547/com.example.assistingagriculture E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.assistingagriculture, PID: 17547
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.assistingagriculture/com.example.assistingagriculture.activity.care_model.ChangePasswordActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:173)
at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)
at android.content.Context.obtainStyledAttributes(Context.java:744)
at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:842)
at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:809)
at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:633)
at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:259)
at com.example.assistingagriculture.activity.care_model.ChangePasswordActivity.<init>(ChangePasswordActivity.java:28)
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
解决方案
将
EditText editText = findViewById(R.id.editText);
声明在
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_password);
// 声明位置
EditText editText = findViewById(R.id.editText);
}
产生原因
产生问题的原因是在 ChangePasswordActivity 类的字段初始化阶段(在对象被创建时)就执行了 findViewById() 方法,而此时 ChangePasswordActivity 对象还未完全初始化。导致 findViewById() 方法中的 Context 对象为 null,从而引发了 NullPointerException。
解决原因
解决方案是将 EditText editText = findViewById(R.id.editText); 的声明移动到 onCreate() 方法中,确保在 setContentView() 方法调用之后进行视图元素的初始化。这样可以确保 findViewById() 方法中的 Context 对象不为空,避免了空指针异常的发生。
总结
若需要某组件的值全局可见,可以在上述问题解决的基础上。定义全局变量,将获取的值赋给全局变量,所需数据变全局可见。
import android.os.Bundle;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.example.assistingagriculture.R;
public class ChangePasswordActivity1 extends AppCompatActivity {
// 定义全局变量
private String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_password);
// 声明位置
EditText editText = findViewById(R.id.editText);
// 赋值给全局变量
password = editText.getText().toString();
}
}
当然,可以通过参数传递的方式,将所需变量传递给你所需的局部域中
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.example.assistingagriculture.R;
public class ChangePasswordActivity1 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_password);
// 声明位置
EditText editText = findViewById(R.id.editText);
// 所需变量传递给你所需的局部域中
new RequestTask().execute(password);
}
public class RequestTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// 这里执行后台任务,例如发送HTTP请求等
String password = params[0];
// 这里只是一个示例,实际的任务需要根据你的需求进行修改
// 此处可以是发送网络请求,验证密码等等
// 假设这里只是简单的返回密码
return password;
}
@Override
protected void onPostExecute(String result) {
// doInBackground执行完毕后,会自动调用此方法,并将结果传递过来
// 在这里处理结果,例如更新UI等
// 这里只是简单地打印结果
System.out.println("Result: " + result);
}
}
}
参考文献
产生原因与解释原因部分 部分内容参考chatgpt
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈