Android 常见错误

来源:互联网 发布:淘宝手淘首页怎么上 编辑:程序博客网 时间:2024/04/27 22:59



一、 java.lang.NullPointerException空指针报异常

比如:

01-01 10:30:36.300: W/System.err(20798): java.lang.NullPointerException

01-01 10:30:36.320: W/System.err(20798):  at com.joyee.neweid.jbpay.UnbindActivity_JBPay$CardBindTask.doInBackground(UnbindActivity_JBPay.java:176)

01-01 10:30:36.390: W/System.err(20798):  at com.joyee.neweid.jbpay.UnbindActivity_JBPay$CardBindTask.doInBackground(UnbindActivity_JBPay.java:1)

01-01 10:30:36.420: W/System.err(20798):  at android.os.AsyncTask$2.call(AsyncTask.java:185)

01-01 10:30:36.440: W/System.err(20798):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

01-01 10:30:36.460: W/System.err(20798):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)

01-01 10:30:36.480: W/System.err(20798):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)

01-01 10:30:36.490: W/System.err(20798):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)

01-01 10:30:36.520: W/System.err(20798):  at java.lang.Thread.run(Thread.java:1019)

这个例子就是用一个null对象调用了它的某一个方法导致的,位于176行代码中。

MyHandler myhandler;  

。。。。。。。。。。

myhandler.sendMessage(msg);

 //这里忘了对 myhandler进行初始化,只是声明了一下,正确的应该是 MyHandler myhandler=new MyHandler();

java.lang.NullPointerException在java中是指空指针异常,是在程序的某一处未取得合法的内存指针数据导致的错误

也就是你对象的引用为空,却要使用对象中的东西
·接口类型的对象没有用具体的类初始化

补充一点,请注意:在IOS里这样做是被允许的,也就是null对象可以调用一个方法不报错,但是Android是不行的。


二、android.view.WindowLeaked窗口句柄泄漏报异常

比如:

06-13 09:16:46.868: E/WindowManager(6646): Activity com.joyee.neweid.jbpay.UnbindActivity_JBPay has leaked windowcom.android.internal.policy.impl.PhoneWindow$DecorView@40576990 that was originally added here
06-13 09:16:46.868: E/WindowManager(6646): android.view.WindowLeaked: Activity com.joyee.neweid.jbpay.UnbindActivity_JBPay has leaked windowcom.android.internal.policy.impl.PhoneWindow$DecorView@40576990 that was originally added here
06-13 09:16:46.868: E/WindowManager(6646):  at android.view.ViewRoot.<init>(ViewRoot.java:308)
06-13 09:16:46.868: E/WindowManager(6646):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:174)
06-13 09:16:46.868: E/WindowManager(6646):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:117)
06-13 09:16:46.868: E/WindowManager(6646):  at android.view.Window$LocalWindowManager.addView(Window.java:424)
06-13 09:16:46.868: E/WindowManager(6646):  at android.app.Dialog.show(Dialog.java:241)
06-13 09:16:46.868: E/WindowManager(6646):  at com.joyee.neweid.jbpay.UnbindActivity_JBPay.showProgress(UnbindActivity_JBPay.java:235)
06-13 09:16:46.868: E/WindowManager(6646):  at com.joyee.neweid.jbpay.UnbindActivity_JBPay.access$0(UnbindActivity_JBPay.java:222)
06-13 09:16:46.868: E/WindowManager(6646):  at com.joyee.neweid.jbpay.UnbindActivity_JBPay$ClickListener.onClick(UnbindActivity_JBPay.java:109)
06-13 09:16:46.868: E/WindowManager(6646):  at android.view.View.performClick(View.java:2604)
06-13 09:16:46.868: E/WindowManager(6646):  at android.view.View$PerformClick.run(View.java:9314)
06-13 09:16:46.868: E/WindowManager(6646):  at android.os.Handler.handleCallback(Handler.java:587)
06-13 09:16:46.868: E/WindowManager(6646):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-13 09:16:46.868: E/WindowManager(6646):  at android.os.Looper.loop(Looper.java:130)
06-13 09:16:46.868: E/WindowManager(6646):  at android.app.ActivityThread.main(ActivityThread.java:3691)
06-13 09:16:46.868: E/WindowManager(6646):  at java.lang.reflect.Method.invokeNative(Native Method)
06-13 09:16:46.868: E/WindowManager(6646):  at java.lang.reflect.Method.invoke(Method.java:507)
06-13 09:16:46.868: E/WindowManager(6646):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
06-13 09:16:46.868: E/WindowManager(6646):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
06-13 09:16:46.868: E/WindowManager(6646):  at dalvik.system.NativeStart.main(Native Method)

这类错误一般比较隐性,不见得运行一次就会报错,往往多次操作就会出现问题,或者打开LogCat就可以看到错误。

起因就是窗口所在Activity已经finish了,但是窗口中的某些View还没结束。比如Dialog,PopupWindows

为什么会出现这样的情况,因为,在异步任务里面已经发生了严重的错误,而导致Activity的强制关闭。Activity强制关闭了,可是ProgressDialog并没有dismiss()掉,所以出现了窗口句柄的泄漏。网上提供的一般建议是:即重写Activity的onDestory()方法,在该方法中调用dismiss()来解除对ProgressDialog的引用。我的方法很简单就是把未结束的控件找出来,妥善处理掉它。一般地,你可以放在Activity finish之前关闭它。

Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而单独存在着,所以当某个Dialog或者某个PopupWindow正在显示的时候我们去finish()了承载该Dialog(或PopupWindow)的Activity时,就会抛Window Leaked异常了,因为这个Dialog(或PopupWindow)的WindowManager已经没有谁可以附属了,所以它的窗体管理器已经泄漏了。

补充一点:Activity.this->指的是所在的这个Activity 的上下文(如果是getApplicationContext(),就表示它的生命周期是整个应用程序)。





0 0