Java 尝试调用虚拟方法';void android.widget.EditText.addTextChangedListener(android.text.TextWatcher)和#x27;关于空对象引用

Java 尝试调用虚拟方法';void android.widget.EditText.addTextChangedListener(android.text.TextWatcher)和#x27;关于空对象引用,java,android,null,android-textwatcher,Java,Android,Null,Android Textwatcher,我花了很多时间寻找解决这个问题的方法。我无法理解为什么这是一个空对象,我也不确定我缺少了什么。如果我试图对代码进行任何更改,它会抛出错误,而我将一事无成。有人知道我可能错过了什么吗 这是正在抛出的erorr: 03-25 11:32:47.068 4802-4802/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.evilcorporation.employeetimeclock, PID: 4802 java.lan

我花了很多时间寻找解决这个问题的方法。我无法理解为什么这是一个空对象,我也不确定我缺少了什么。如果我试图对代码进行任何更改,它会抛出错误,而我将一事无成。有人知道我可能错过了什么吗

这是正在抛出的erorr:

03-25 11:32:47.068 4802-4802/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.evilcorporation.employeetimeclock, PID: 4802
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.evilcorporation.employeetimeclock/com.evilcorporation.employeetimeclock.ui.login.LoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.addTextChangedListener(android.text.TextWatcher)' 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.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        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 'void android.widget.EditText.addTextChangedListener(android.text.TextWatcher)' on a null object reference
        at com.evilcorporation.employeetimeclock.ui.login.LoginActivity.onCreate(LoginActivity.java:99)
        at android.app.Activity.performCreate(Activity.java:6251)
        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.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
        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)```
以下是我的LoginActivity.java:

package com.evillorporation.employeetimeclock.ui.login;
导入android.app.Activity;
导入androidx.lifecycle.Observer;
导入androidx.lifecycle.ViewModel;
导入androidx.lifecycle.ViewModelProvider;
导入androidx.lifecycle.ViewModelProviders;
导入android.os.Bundle;
导入androidx.annotation.Nullable;
导入androidx.annotation.StringRes;
导入androidx.appcompat.app.appcompat活动;
导入androidx.lifecycle.ViewModelStore;
导入androidx.lifecycle.ViewModelStoreOwner;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.KeyEvent;
导入android.view.view;
导入android.view.inputmethod.EditorInfo;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ProgressBar;
导入android.widget.TextView;
导入android.widget.Toast;
import com.evillocorporation.employeetimeclock.R;
导入com.evillorporation.employeetimeclock.ui.login.LoginViewModel;
导入com.evillorporation.employeetimeclock.ui.login.LoginViewModelFactory;
公共类LoginActivity扩展了AppCompatActivity{
私人LoginView模型LoginView模型;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loginViewModel=ViewModelProviders.of(这是新的LoginViewModelFactory())
.get(LoginViewModel.class);
最终EditText用户名EditText=findViewById(R.id.username);
final EditText passwordEditText=findViewById(R.id.password);
最终按钮登录按钮=findViewById(R.id.login);
最终进度条加载进度条=findViewById(R.id.loading);
loginViewModel.getLoginFormState().observe(这是新的观察者(){
@凌驾
更改后的公共void(@Nullable LoginFormState LoginFormState){
如果(loginFormState==null){
返回;
}
setEnabled(loginFormState.isDataValid());
if(loginFormState.getUsernameError()!=null){
setError(getString(loginFormState.getUsernameError());
}
if(loginFormState.getPasswordError()!=null){
setError(getString(loginFormState.getPasswordError());
}
}
});
loginViewModel.getLoginResult().observe(这是新的观察者(){
@凌驾
更改后的公共无效(@Nullable LoginResult LoginResult){
如果(loginResult==null){
返回;
}
加载ProgressBar.setVisibility(View.GONE);
if(loginResult.getError()!=null){
showLoginFailed(loginResult.getError());
}
if(loginResult.getSuccess()!=null){
updateUiWithUser(loginResult.getSuccess());
}
setResult(活动结果_OK);
//成功后完成并销毁登录活动
完成();
}
});
TextWatcher PostTextChangedListener=新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
//忽略
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
//忽略
}
@凌驾
公共无效后文本已更改(可编辑){
loginViewModel.loginDataChanged(用户名EditText.getText().toString(),
passwordEditText.getText().toString());
}
};
usernameEditText.addTextChangedListener(后TextChangedListener);
passwordEditText.addTextChangedListener(后TextChangedListener);
passwordEditText.setOnEditorActionListener(新的TextView.OnEditorActionListener(){
@凌驾
公共布尔onEditorAction(TextView v、int actionId、KeyEvent事件){
if(actionId==EditorInfo.IME\u ACTION\u DONE){
loginViewModel.login(usernameEditText.getText().toString(),
passwordEditText.getText().toString());
}
返回false;
}
});
loginButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
加载ProgressBar.setVisibility(View.VISIBLE);
loginViewModel.login(usernameEditText.getText().toString(),
passwordEditText.getText().toString());
}
});
}
私有void updateUiWithUser(LoggedInUserView模型){
String welcome=getString(R.String.welcome)+model.getDisplayName();
//TODO:启动成功登录体验
Toast.makeText(getApplicationContext(),welcome,Toast.LENGTH_LONG.show();
}
私有void showLoginFailed(@StringRes Integer errorString){
Toast.makeText(getApplicationContext(),errorString,Toast.LENGTH_SHORT).show();
}
}

如果需要更多信息来帮助解决这个问题,请告诉我,我很乐意提供更多信息。谢谢

在方法内声明editText、button和progressbar并使其为null或其他方法无法访问的方式。那么,联合国
public class LoginActivity extends AppCompatActivity {

private LoginViewModel loginViewModel;


 protected EditText usernameEditText;
 protected EditText passwordEditText;
 protected Button loginButton;
 protected ProgressBar loadingProgressBar;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory())
            .get(LoginViewModel.class);

    usernameEditText = findViewById(R.id.username);
    passwordEditText = findViewById(R.id.password);
    loginButton = findViewById(R.id.login);
    loadingProgressBar = findViewById(R.id.loading);