java.lang.NullPointerException 空指针异常之一:对象真的为空吗?

    在开发中,需要传入页面表单作为查询条件,在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是不存在的, 是找不到的,也就是堆栈内存没有地址引用的,这才是它们之间最本质的区别。

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值