Java 空指针异常错误

Java 空指针异常错误,java,android,oop,Java,Android,Oop,我为过滤器搜索栏创建了一个onDestroy方法,遇到了一个小问题 这是我的日志: 09-01 01:55:40.147: E/AndroidRuntime(1014): FATAL EXCEPTION: main 09-01 01:55:40.147: E/AndroidRuntime(1014): java.lang.RuntimeException: Unable to destroy activity {com.stts.sparetimetradingsystem/com.stts.s

我为过滤器搜索栏创建了一个onDestroy方法,遇到了一个小问题

这是我的日志:

09-01 01:55:40.147: E/AndroidRuntime(1014): FATAL EXCEPTION: main
09-01 01:55:40.147: E/AndroidRuntime(1014): java.lang.RuntimeException: Unable to destroy activity {com.stts.sparetimetradingsystem/com.stts.sparetimetradingsystem.employer.HomepageEmployerActivity}: java.lang.NullPointerException
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3655)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.access$2900(ActivityThread.java:125)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.os.Looper.loop(Looper.java:123)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at java.lang.reflect.Method.invokeNative(Native Method)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at java.lang.reflect.Method.invoke(Method.java:521)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at dalvik.system.NativeStart.main(Native Method)
09-01 01:55:40.147: E/AndroidRuntime(1014): Caused by: java.lang.NullPointerException
09-01 01:55:40.147: E/AndroidRuntime(1014):     at com.stts.sparetimetradingsystem.employer.HomepageEmployerActivity.onDestroy(HomepageEmployerActivity.java:340)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642)
09-01 01:55:40.147: E/AndroidRuntime(1014):     ... 11 more
这是我的代码:

@Override
protected void onDestroy() {
    super.onDestroy();
    searchBarEmployer.removeTextChangedListener(filterTextWatcher); <--- LINE 340
}
@覆盖
受保护的空onDestroy(){
super.ondestory();

searchBarEmployer.removeTextChangedListener(filterTextWatcher);您做错了。若您重写了
onCreate()
(或者通常是类似构造函数的方法),那个么经验法则是首先调用
super.onCreate()
(以初始化所有stull超类可能需要的等)然后做你自己的事情。但是如果你重写了
onDestroy()
(或者在一般的类似析构函数的方法中),那么经验法则是按照你在
onCreate()
中做的相反顺序来做所有的清理工作。首先清除自己的东西,然后调用
super.onDestroy()
作为最后一件事之一。否则就做(就像你做的那样)可能会导致许多问题,因为超级类可能会简单地清理很多东西(如内部变量、引用等),而您的代码将简单地崩溃。请像这样重新排列您的
ondestory()

@Override
protected void onDestroy() {
    searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    super.onDestroy();
}
还有一个选项是您的
searchBarEmployer
仅为空,因此这可能更安全:

@Override
protected void onDestroy() {
    if( searchBarEmployer != null ) {
      searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    }
    super.onDestroy();
}

请放置调试点并确保
searchBarEmployer
不为空

如果由于前面执行的某些步骤而导致
null
,请在此语句之前进行null检查

if( searchBarEmployer != null ) {
// Place operation here...
}
你也应该搬家

super.onDestroy();
作为方法的最后一个语句

编辑我的意思是

@Override
protected void onDestroy() {
    if( searchBarEmployer != null ) {    // <---- PLACE NULL CHECK
      searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    }
    super.onDestroy();  // <--- LAST STATEMENT
}
@覆盖
受保护的空onDestroy(){

如果(searchBarEmployer!=null){/请确保您的
searchBarEmployer
已正确初始化和引用

EditText searchBarEmployer ; // outside onCreate, global to class
在onCreate()中

而且


如有必要,请初始化searchBarEmployer。 比如,如果searchBarEmployer是一个文本视图,那么将其声明为top,然后执行searchBarEmployer=(TextView)findviewbyd(R.id…),依此类推,然后使用它

避免使用 TextView searchBarEmployer=null;
方法。

我希望您的
searchBarEmployer
已正确初始化和引用。我如何初始化它?searchBarEmployer是我的编辑文本。请检查我下面的答案。我已经在那里给出了代码。:)将其移到最后一个语句是什么意思?是的。现在尝试此更改。是的,我做了所有这些。现在没有错误但是在我无法访问主页之后。登录之后应该转到主页,但它会返回到登录页面。请确保您在findById()中使用了正确的EditText id。它是您在XML文件中定义EditText布局的id。还要确保super.onDestroy()是函数中的最后一条语句。@SarahPhil:如果要转到主页,必须定义将其带到该页面的意图并启动该意图。非常感谢您的帮助。我在这里创建了一个新问题:
EditText searchBarEmployer ; // outside onCreate, global to class
searchBarEmployer = (EditText)findViewById(R.id.editTextIdInXML);
@Override
protected void onDestroy() {
    searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    super.onDestroy();

}