解决第一个crash

调试程序出现异常,用debug看到的是空指针异常。debug真的好用啊,
没有它还真不行。但是哪里出现的空指针?通过断点跟踪,没有找
到代码行。可能断点的地方设置不对。

出现问题的时候,求助于网络是个很好的方法。看了很多帖子,觉得
一个帖子比较符合我遇到的情况。这个帖子分析了应用crash的三种情况,
其中一条“对象为空”和我的情况比较类似。

为了排查那个对象为空,我采用了一种最笨的方法,就是隔离代码。
具体来说,按照执行的次序,注释掉部分后执行的代码,保留前半
部分的代码。因为代码不多,所以,这个方法适用,而且还比较有效。

这样的“二分法”,使我很快的定位了问题出在什么地方。原来,是一个、
调用findViewById(R.laytou.image_view)返回了一个空的指针。循着这个线索,
根据我对于语言的理解,我推测肯定是这个ImageView对象没有初始化。

再仔细看看我的代码,发现我在定义私有变量mImageView的时候,就调
用了findViewById,可是,此时是编译时,参数image_view这个xml中描述
的对象可能没有初始化。根据我的经验,我觉得系统可能是在当前的
继承于Activity类的类的对象在初始化onCreate的时候,会解析xml文件,
然后,根据里面的view等空间做初始化。而私有变量应该是在这之前。

于是,我在类中只生命一个ImageView的私有变量,但是,并不定义,也
不赋值。而赋值是写在onCreate函数里面,并且在setContentView之后。
因为,我确信,setContentView肯定对于ImageView控件进行了初始化。

这么一改之后,果然OK了。

回忆起来,写代码的时候有些想当然了,没有分析对象的生存期。
不过,在问题解决之后,感觉经验值提升了。还是那句话,遇到问题
不是坏事,经验就在一个个问题之后增长。

虽然现在按说已经是春天了,但是天气依然寒冷,昨天还下雪籽,这是
春天么?窗外北风的呼啸,让人不寒而栗。而我的手也冻得冰冷。但是,
直到停下来,我才发觉。这可能就是程序员的生活?鄙视也罢,欣赏也
好,它就真实的存在于这个世界里面。
posted @ 2012-02-28 21:37  爱心觉罗氏  阅读(434)  评论(0编辑  收藏  举报