Java 空指针异常错误
我为过滤器搜索栏创建了一个onDestroy方法,遇到了一个小问题 这是我的日志: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
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();
}