论坛首页 Java企业应用论坛

我承认我没有if(xxx != null)

浏览 7862 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-09-08  
mathfox 写道
不能绝对化,不过,你的确是不应该判断

判断也没有什么用,也没有解决方案。还不如早把问题暴露出来。


可是在程序的关键部分,你也这么做么?我认为,在有些时候,判断一下还是很有用的。
0 请登录后投票
   发表时间:2010-09-08  
鱼言风语 写道
UI的validation应该判断,其它地方应该不判断,让exception抛出来吧?


好像是你们team leader不对

难道后台就不会产生空指针?
0 请登录后投票
   发表时间:2010-09-08   最后修改:2010-09-08
cantellow 写道
鱼言风语 写道
UI的validation应该判断,其它地方应该不判断,让exception抛出来吧?


好像是你们team leader不对

难道后台就不会产生空指针?



有2种情况,第一种是不应该为空的,比如你首贴的那个场景,如果是契约式编程,不应为空,那你不需要判断。出这种异常要做的事情就是检查环境配置。否则,虽然可以用assertNotNull,但还是很烦的。

第二种情况是有可能为空,比如表的某个字段,这种当然需要判断
0 请登录后投票
   发表时间:2010-09-08  
luciferdevil 写道
一般需要在给页面对象或者List时,我会常常在获取对象的那个方法有个new:
List<String> list=new ArrayList();
这样无论这个方法最终有没有得到数据,这个list都不会是null的,页面判断的时候只是if(list.size()==0){//对不起没有找到相关的数据}
用null的话 一个不好 就给用户500错误(以前在项目测试前期会出现这个……)


这个还是要看情况,或许在你这种情况下这种处理方式比较好。
但是换一种情况,想象一个复合数据结构,它的值跟用户没有任何关系,完全是后台业务逻辑所致。
如果本身因为某些不正当操作,比如解析一个XML文件,可能是因为你的XML文件格式有关,多写了一个<或者多写了一个/>,那么解析出错很可能返回的是null,如果你new一个对象,客户类怎么知道你这个对象是正常逻辑得到的?
客户类肯定会因为这个对象的数据时正常的,所以xml格式的错误一直不会发现,那么这可能会很悲剧。

个人认为如果对象跟用户的操作有关(比如输入),那么就应该判断,或者在用户操作的时候就做一些限制,而如果对象的生成跟业务逻辑是否正确有关,那么空指针就应该大胆的抛出,并做好log,为了好解决问题的根源所在。
0 请登录后投票
   发表时间:2010-09-08  
fhyfufangyu 写道
JSP+EL :NullPointer的时候直接输出null,让我想起了卓越亚马逊的包裹地址:XX市XX区XX街null号。。。。
Freemarker:矫枉过正,到处都是XXX?if_exists  或者xx?default('')

以前做freemarker时,页面判断确实很郁闷,很多判断。List?XX.object?XX.subObject?XX.property?XX
0 请登录后投票
   发表时间:2010-09-08  
struts 写道
页面用el表达式.

我是做swing的
0 请登录后投票
   发表时间:2010-09-08  
鱼言风语 写道
cantellow 写道
鱼言风语 写道
UI的validation应该判断,其它地方应该不判断,让exception抛出来吧?


好像是你们team leader不对

难道后台就不会产生空指针?



有2种情况,第一种是不应该为空的,比如你首贴的那个场景,如果是契约式编程,不应为空,那你不需要判断。出这种异常要做的事情就是检查环境配置。否则,虽然可以用assertNotNull,但还是很烦的。

第二种情况是有可能为空,比如表的某个字段,这种当然需要判断

比较同意,总结一点就是,某些情况下空指针的触发是因为其他的错误根源导致,那么就应该抛出,检查环境配置,修正问题的根源。某些情况下null的来源是“很正常的”,比如用户输入的情况,数据库的字段等等,那么这时不得不判断,或者使用断言。
0 请登录后投票
   发表时间:2010-09-08   最后修改:2010-09-08
elmar 写道
判断是不是NULL是caller的责任,而不是callee的责任。Callee可以假设传入的值是合法的。

我一般在某些场景:callee也判判一下。
假设一个场景:批量删除操作
jsp page:
一堆checkbox,id都是:objectIds

action层:
String[] warnIds;

delete(String[] warnIds){
   service.remove(warnIds);
}

Service层

remove(String[] warnIds){
		if (warnIds != null){

			for (int i = 0; i < warnIds.length; i++) {
				Warn warnTemp = (Warn) warnDao.getObject(
						Warn.class, Long.parseLong(warnIds[i]));
				if (warnTemp != null) {
					//Warn warn = new Warn();
					// BeanUtils.copyProperties(warn, warnTemp);
					warnTemp.setDealIndex(new Long(2));
					warnDao.updateObject(warnTemp);
//					warn.setMsgId(warnTemp.getMsgId());
//					warn.setWarnLevel(warnTemp.getWarnLevel());
//					warn.setWarnMsg(warnTemp.getWarnMsg());
//					warnDao.saveObject(warn);
//					warnDao.removeObject(warnTemp);
				}
			}
		}
}
0 请登录后投票
   发表时间:2010-09-08  
个人认为:如果无异常处理机制的系统里,在后台程序里只要有对对像进行操作,都应该做NULL值判定。程序的严谨性远远重于程序的可读性。如果页面有用到JAVA代码而不是用的标签,更应该考虑到这一点。否则用户一点一大堆看不懂的代码就出来了,你做的系统会大大打折的!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics