在开发中,需要传入页面表单作为查询条件,在DAO层进行数据库的select操作,如果form为空,那么查询所有的数据出来,如果form不为空,那么查询满足form条件的数据。我们把这个开发需求形象化一点:一个学生登录教务处查看自己的成绩,刚登录成绩查询页面的时候,什么参数都没有(form没有值),看到的是他所有的成绩;当他在课程名称,课程所在学期(年),授课老师名字等输入框输入正常的数据后,点击查询按钮(form有值了),查看到的是满足form条件的数据。
好了,需求描述完了,我在写DAO的sql语句时,模仿着公司其他人的代码写的,除了数据库语句不一样外,其他所有都一样,可是在跑的时候,我的就报了java.lang.NullPointerException异常,搞了很久没有搞定,问了一下大佬,大佬说我的form对象为空,我说你的(方法里的参数)form在第一次跳转页面的时候也没有值呀(就像我们登录成绩查询页面时看到的是我们全部的成绩),他让我再仔细看看两个form有什么不同,我才发现了区别,我把它们贴出来:
这个是正确的form,它为空(null)吗?它不为空,为空的是它的属性。我们再来看看我方法里面的form:
看到区别没有,我的form是直接=null,这才是导致空指针的原因:我在添加查询参数,即form.getXXX()参数时,编译检查时会通过,但在运行时,form都为空了,哪来的.getXXX()方法呢,所以报了空指针异常。
我们再往深处探究这两个form的不同:正确的form有类型,有地址(JVM分配了空间),有参数,参数为NULL,人家是完整的对象;而错误的form在JVM是不存在的, 是找不到的,也就是堆栈内存没有地址引用的,这才是它们之间最本质的区别。