- 浏览: 847281 次
- 性别:
- 来自: 草帽海贼团
文章分类
最新评论
-
大维啊:
估计只有你自己能明白
Java安全沙箱机制 -
moonljt521:
第五种方式,如果构造里想传入参数怎么做,例如android的 ...
单例模式的七种写法 -
javaDADY:
怎么感觉在讨论茴香豆的茴字有几种写法?
单例模式的七种写法 -
Wallen_Han:
Mr.Cheney 写道这样的:Mr.Cheney 写道还有一 ...
单例模式的七种写法 -
Wallen_Han:
60love5 写道第三种稍微有点Java基础就知道是错的,被 ...
单例模式的七种写法
昨天正在编码兴头时被项目组xx叫去,说我修改的代码出了空指针异常,还说关键的地方比如这是界面的发起部分,就应该判断是否空指针,不然过不去。我看了一下他的环境,说你没有我的数据库脚本,如果有了数据库环境,应该就不会出现这种情况,然后他就说你这个方法本来就有抛出NullPointerException的可能性,为什么调用完之后不判断呢?而且这是程序的关键部分,出了问题界面都发不起。嗯,好吧,我承认这是我的失误,随即加了if(xxx != null)判断。
对于这件事,引发了我对空指针最佳实践的思考,想必我们使用最多的方法就是在可能发生空指针异常的地方加上:if(xxx != null),每个人都对抛出空指针异常的可能性都不同,换句话说就是这种可能性很难统一和界定,如果使用这种方式,那么代码肯定奇丑难看,到处都是if(xxx != null)else…。而且else部分也不一样,要么什么都不做,要么直接返回提示错误,要么就重新赋一个默认的值。
还有种方式就是在产生return null的地方用new对象代替,这个new对象纯粹是为了防止客户类出现null,可是这样做的可读性降低了,个人认为跟脱了裤子放屁没两样。Api中return null这种写法也比较常见,比较符合OO逻辑。
既然不能避免null,那么你就必须小心翼翼,因为你对每个对象的操作之前你都不能保证它一定是非null,除非你做了判断,Api中为了保证某些值一定不能为null时,采用这种方式:if (name == null) {throw new NullPointerException();}。那我们自己的程序能不能这样写呢?我觉得大多数java程序的现状就是,关键地方使用了if(xxx != null)判断,某些边缘没有判断,所以经常会发生空指针异常。
好像findBugs可以找到可能发生null的地方,不知道它的建议做法是什么?面对NullPointerException,各位有没有更好的做法呢?
====================================================================================
被投隐了,不过没关系,关于几点我还要说明一下,NullPointerException是一个runtimeException,它不会像车checkedException,要么让你“吞掉”,要么让你抛出,就因为它是uncheckedException,所以我们无法精确判断哪个地方会抛出NullPointerException(其实大多数时候是我们根本没有考虑)。
设计模式中有个null object模式,它的大概意思就是对领域对象继承一个null object,它里面什么都不干,代表一个无的概念,用return null object代替return null,这样就避免了NullPointerException的出现。但是个人建议还是要分场合使用,如果return null代表“这段程序不是出现异常了才返回null,而是null本身就代表了一个无的概念”,再现实一点,遍历一个person集合,查找某个person,如果没有查找到,通常我们返回null,这里,就可以用用return null object代替return null了。
是该总结一下空指针的最佳实践了,还是从空指针产生的根源来说:
1.在应用前端,如果null的产生是一个正常的业务逻辑的分支,比如用户的输入,你并没有限制用户可以什么都不干,那么我们就应该使用if(xxx != null)判断,如果为null,我们会给用户一个提示一个对话框,而不是一大堆异常。
2.如果null的产生是应用真正走向了异常边缘,比如环境配置问题,其他前调方法的错误,那么这时就应该大胆的抛出异常,在方法的前置条件使用断言,或者统一判断可能为null的地方,如果为null就抛出NullPointerException,或者什么都不干,大胆的往前走。举一个我实际遇到的例子,方法的入口是一个复合数据结构,但这个复合数据结构是解析xml得来的,有一天,我写的xml格式不对,导致复合数据结构某些引用指向null,那么这个时候,我们就应该大胆的抛出这个异常,让我们早点发现错误的根源,而不是使用if(xxx != null)判断或者使用一个null object导致我们以为什么问题都没有发生,或者感到不对了,却找了半天的问题根源。
3.在合适的情况下,使用null object,就像前面说的,我们在返回return null的时候用return null object代替。
评论
我一般在某些场景: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); } } } }
好像是你们team leader不对
难道后台就不会产生空指针?
有2种情况,第一种是不应该为空的,比如你首贴的那个场景,如果是契约式编程,不应为空,那你不需要判断。出这种异常要做的事情就是检查环境配置。否则,虽然可以用assertNotNull,但还是很烦的。
第二种情况是有可能为空,比如表的某个字段,这种当然需要判断
比较同意,总结一点就是,某些情况下空指针的触发是因为其他的错误根源导致,那么就应该抛出,检查环境配置,修正问题的根源。某些情况下null的来源是“很正常的”,比如用户输入的情况,数据库的字段等等,那么这时不得不判断,或者使用断言。
我是做swing的
Freemarker:矫枉过正,到处都是XXX?if_exists 或者xx?default('')
以前做freemarker时,页面判断确实很郁闷,很多判断。List?XX.object?XX.subObject?XX.property?XX
List<String> list=new ArrayList();
这样无论这个方法最终有没有得到数据,这个list都不会是null的,页面判断的时候只是if(list.size()==0){//对不起没有找到相关的数据}
用null的话 一个不好 就给用户500错误(以前在项目测试前期会出现这个……)
这个还是要看情况,或许在你这种情况下这种处理方式比较好。
但是换一种情况,想象一个复合数据结构,它的值跟用户没有任何关系,完全是后台业务逻辑所致。
如果本身因为某些不正当操作,比如解析一个XML文件,可能是因为你的XML文件格式有关,多写了一个<或者多写了一个/>,那么解析出错很可能返回的是null,如果你new一个对象,客户类怎么知道你这个对象是正常逻辑得到的?
客户类肯定会因为这个对象的数据时正常的,所以xml格式的错误一直不会发现,那么这可能会很悲剧。
个人认为如果对象跟用户的操作有关(比如输入),那么就应该判断,或者在用户操作的时候就做一些限制,而如果对象的生成跟业务逻辑是否正确有关,那么空指针就应该大胆的抛出,并做好log,为了好解决问题的根源所在。
好像是你们team leader不对
难道后台就不会产生空指针?
有2种情况,第一种是不应该为空的,比如你首贴的那个场景,如果是契约式编程,不应为空,那你不需要判断。出这种异常要做的事情就是检查环境配置。否则,虽然可以用assertNotNull,但还是很烦的。
第二种情况是有可能为空,比如表的某个字段,这种当然需要判断
好像是你们team leader不对
难道后台就不会产生空指针?
判断也没有什么用,也没有解决方案。还不如早把问题暴露出来。
可是在程序的关键部分,你也这么做么?我认为,在有些时候,判断一下还是很有用的。
比如collections.sort方法就不判断null,因为它觉得判断null不是他的责任
嗯,比如说契约设计。
项目内部的代码就不用那么严格了 会死人的
Freemarker:矫枉过正,到处都是XXX?if_exists 或者xx?default('')
看看Spring的Assert
在程序的入口处多参数进行断言
优秀的程序员是即使过单行道的时候都会向道路两边看看再过去。这话这几天炒得很火。
无论如何. 只能给用户界面显示友好的错误消息.
发表评论
-
解决eclipse每次启动maven很慢
2012-11-14 12:31 17858好久没有用eclipse了,离开人人后maven私有仓库当然也 ... -
Debug控
2011-08-02 14:34 3587我是一个debug控,很 ... -
泛型のwhy&how
2011-07-21 18:35 1414Why,Java为什么需要 ... -
【分享】Findbugs反模式
2011-05-20 09:54 5265FindBugs解释 FindBugs 是一个静态分 ... -
Findbugs反模式
2011-05-20 09:46 0FindBugs介绍 FindBugs 是一个静态分 ... -
正则表达式Mini版
2010-10-27 12:14 13731.句点符号:. 条件 ... -
Eclipse下jar包版本不一致等常见问题
2010-09-15 20:18 7990我借这个平台简单说说Eclipse下配置环境需要注意的几点 ... -
jtextfield限制字数与数字输入
2010-02-21 15:40 64import javax.swing.text.*; p ... -
Swing线程机制以及invokeLater和invokeAndWait
2009-09-14 11:05 7119本人最近想写一个仿QQ,初学Swing对线程机制不太了解,所以 ... -
在重写了对象的equals方法后,还需要重写hashCode方法吗?
2009-08-19 21:08 2035首先说建议的情况: 比如你的对象想放到Set集合或者是想作为 ... -
第五惑:初始化和动态绑定之间的小小冲突
2009-04-04 23:46 1241今天骑车去都江堰了,很累很累,没准备好今天该发什么Tips,所 ... -
第四惑:属性是否被动态绑定?
2009-04-03 17:11 1161众所周知,方法可以被动态绑定,在子类被向上转型为父类时,虚拟机 ... -
第三惑:类型被动使用举例
2009-04-02 13:04 1424当类型属于被动使用的 ... -
第二惑:类型在没有被完全初始化之前就生成实例对象所表现的情况
2009-04-01 13:41 1487public class MainTest { publi ... -
第一惑:类初始化时,final修饰的静态字段的表现方式
2009-03-31 16:27 1836计划从今天开始,模仿一下jythoner大哥,不过不是Java ... -
Java动态绑定虚拟机实现
2009-03-25 20:19 1726今天在51CTO看到一篇很好的介绍Java动态绑定的文章。先转 ... -
Java虚拟机简单介绍
2009-03-25 20:17 110请参考:http://cantellow.iteye.com/ ... -
Java夜未眠·经典句子选载
2009-03-25 20:16 2852最近在读前辈蔡学镛《Java夜未眠·程序员的心声》,几天就看完 ... -
代码签名和认证
2009-03-25 20:06 1769要对一段代码作担保或 ... -
Java安全沙箱机制
2009-03-25 20:05 4640说明,本文部分内容转 ...
相关推荐
= NULL){ strRet = m_iniFile->GetValue("moonlightService", "DIPAddr"); } 4.最后在析构函数记得再判断释放这个碎片化的堆空间(严谨做法) 举例: if (m_iniFile != NULL){ delete m_iniFile; m_...
if (null != bis) { bis.close(); } if (null != fis) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } return true; } /** * ...
= null || excelWorkBook != undefined) { excelWorkBook.Close(); } if (excelApp != null || excelApp != undefined) { excelApp.Application.Quit(); excelApp = null; } } } ``` 这段代码首先创建了一个...
=`运算符可以安全地用于比较`null`,但`>`、`等运算符会因为无法对`null`进行计算而抛出异常。 #### 4. `xxx == null`与`null == xxx`的等价性 在Java中,`xxx == null`与`null == xxx`是等价的,并且无论哪种写法...
1.在View中显示“您好,我是XXX!”。 2.文本在View内自左向右循环滚动; 3.文字在红、蓝、绿、黄四种颜色之间周期变化。红(255,0,0)蓝(0,255,0)绿(0, 0,255)黄(255,255,0);
= NULL) && (bSrc != NULL)); char* address = aDest; while ((*aDest++ = *bSrc++) != '\0') NULL; return address; } ``` **说明:** 该函数用于将一个字符串复制到另一个字符串中。 #### 2. 字符串比较 `...
=null && Convert.ToBoolean(obj)==true){ //Do something}上面的代码的意图很明显,先判断obj 是不是null,如果不是null 的话,再调用Convert.ToBoolean方法,判断是不是True。 上面的方法没有任何问题,但有一点...
= null && Request.Cookies[strName].Values[subKey] != null) return Server.HtmlEncode(Request.Cookies[strName][subKey].Value); else return null; } } ``` 使用这个类,你可以在应用程序中方便地调用`...
3. **错误检测**:在整个初始化过程中,频繁使用`if(xxx != DD_OK)`的方式进行错误检测,确保每一步操作都正确无误。 ### 结论 通过以上内容,我们可以了解到DirectDraw在游戏开发中的重要性和基本使用流程。...
if (null != zos) { zos.close(); } } } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:37:55 * 版本: V0.1 * 修改者: * 修改日期: ...
== 'object' || left === null) return false; // getPrototypeOf 是 Object 对象自带的 API,能够拿到参数的原型对象 let proto = Object.getPrototypeOf(left); while (true) { if (proto === null) return ...
= null && extension.equalsIgnoreCase(".png")) { return true; } } return false; } public String getDescription() { return "PNG图片"; } private String getExtension(File f) { if (f != null) { ...
#ifnotnull($XXX) 变量$XXX不为null #else 变量$XXX为null #endif ``` #### 方法二:`$null.isNull()` 这是一个更直接的检查方式,无需额外配置。推荐使用此方法,特别是当判断集合对象是否为null时,非常实用。...
if err != nil { log.Fatalf("failed to listen: %v", err) } log.Println("Server is running on port 50051...") if err := server.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } ``` 5....
我自己的VC++课程设计作业。 int k=0; srand((unsigned)time(NULL));... if(j%3!=0) { ofs(4)☆★☆★☆"; } else //三个数换行 数字后面不带符号 { printf("\n"); ofs(4); } } ofs.close();
== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1); } if (!isMobileDevice()) { alert("对不起,此页面仅支持移动设备访问。"); // 或者重定向到其他页面 window.location.href = ...
输入名字,程序就会自动问候你,是不是很神奇啊!? 那就快一点下来看看吧!!体验不一样的感觉吧!!
= null and langId != null"> and lang_id = #{langId} </if> ``` 在这个修正后的代码中,`test`属性的条件表达式检查了`_parameter`对象是否存在(即参数不为空)以及`langId`是否不为空。当`langId`有值时,...
= null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } ``` 6. 结果集的状态:ResultSet有三种状态:未初始化、已移动到下一行和结束。调用next()会改变其状态,且一旦到达...
=,>,<,>=,<=:比较大小,第二个操作数(运算符后面那个)支持IAKIOI,int 时间复杂度,n表示第一个操作数,m表示第二个操作数: 加法:O(max(n, m)) 减法:O(max(n, m)) 乘法:O(nm),抱歉我不会 FFT。 除法:O...