`
chenchuan
  • 浏览: 17342 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

残酷的非空if判断

阅读更多
经常我们在开发过程中会出现很多if(xx==null)等这样的判断,而且基本上会占据大量的这样非空的这样的判断,对于编码来说很反感,但是在代码中如果不进行这样的判断又会造成程序的bug,  大家有什么好的想法能解决这个问题,大家平时的编码习惯是怎么样的 一起讨论
分享到:
评论
35 楼 gtssgtss 2011-06-13  
sniffer123 写道
有一些你根本不用去判断 健壮的代码并不代表不出错,只要你认为在运行到这里的时候,参数必须非空,那么你完全可以直接使用而不去判断。当出现空值程序terminal的时候,你可以看出错栈查找问题或者这根本不是你应该考虑的问题(因为是别人调用你的,既然调用你的接口,那就必须遵守你的规则,是否非空是他应该做的事)
当然你可以用assert 这样出问题用dbg的版本查看,发布的时候又可以去掉提高效率。我个人是不建议用try去做这些事。



支持这种做法,怎么简单怎么来,反正要错也是别人错,别人sb我不负责
34 楼 taolei0628 2011-06-13  
通常我都是用偷懒的方式这么写的:
public void method(Object obj1,Object obj2)
{
    obj1.getClass();//if(obj1==null) throw new NullPointerException();
    obj2.getClass();

}
33 楼 king130520 2011-05-20  
在数据库中杜绝这种情况
32 楼 lishaorui 2011-05-20  
如果是对象的话,直接判断;
如果是字符串的话,用StringUtils的isEmpty()或者自己封装一个方法。。。
代码里,避免不了这些判断。
31 楼 satanultra 2011-05-20  
写程序连基本的判断都懒得写,不知道你编程的时候脑子里都想些什么,糊弄应付吗?
30 楼 yanzhexian 2011-05-20  
幻无极 写道
还是js的写法轻松点


人那个叫undefined
29 楼 sunxiang0918 2011-05-19  
liu.anxin 写道
公司内部统一, 尽量多使用公共工具类呗.
/**
 * 空字符串判断, <span style="color:red;">去左右空格后</span>, 如果为空返回 true<br/>
 * <span style="color:green;">为保证安全, 要事先定义好密码首尾是否能有空格</span>
 * 
 * @param param
 * @return boolean
 */
public static boolean isNull(CharSequence param) {
	return (param == null || "".equals(param.toString().trim()));
}


null 没必要置前, 那样的实际意义一样, 但感觉上让人非常别扭, "".equals 却很有必要, 不然会 NullPoint.


如果在条件判断的||前面已经有Null的判断了,后面 是 param.equals 还是 "".equals 都一样吧.
28 楼 mouer 2011-05-19  
用框架么,如果用一般都有org.apache.commons.lang。
那么,有个StringUtils类,里面有你所需要的方法,用不着自己去实现。
27 楼 bingoohuang 2011-05-18  
The google collections framework offers a good and elegant way to achieve the null check.

There is a method in a library class like this:

static <T> T checkNotNull(T e){
   if(e == null){
      throw new NullPointerException();
   }
   return e;
}
And the usage is (with import static):

...
void foo(int a, Person p){
   if(checkNotNull(p).getAge() > a){
      ...
   }else{
      ...
   }
}
...
or in your example:

checkNotNull(someobject);
someobject.doCalc();
26 楼 yangguo 2011-05-18  
proxy or aop


class KillNullProxy{
AObject obj;
execute(xx){
if(xx!=null){
  obj.execute(xx);
}
else 
sysout("null!!");
}

class XXObject extends AObject{
 execute(xx){
  sysout(xx + " must be not null");
}
}
class YYObject extends AObject{
  execute(yy){
  sysout(yy + " must be not null");
}

AObject obj = ProxyFactory.getProxy(KillNullProxy.class,XXObject.class);
obj.execute("a");
obj.execute(null);
obj = ProxyFactory.getProxy(KillNullProxy.class,YYObject.class);
obj.execute("b");
}

25 楼 sniffer123 2011-05-18  
有一些你根本不用去判断 健壮的代码并不代表不出错,只要你认为在运行到这里的时候,参数必须非空,那么你完全可以直接使用而不去判断。当出现空值程序terminal的时候,你可以看出错栈查找问题或者这根本不是你应该考虑的问题(因为是别人调用你的,既然调用你的接口,那就必须遵守你的规则,是否非空是他应该做的事)
当然你可以用assert 这样出问题用dbg的版本查看,发布的时候又可以去掉提高效率。我个人是不建议用try去做这些事。
24 楼 greatghoul 2011-05-18  
如果你实在不喜欢这种写法,那就写try catch 吧,不过觉得更麻烦。
23 楼 Angi 2011-05-18  
哦,最近也纠结过这个问题,哎
22 楼 Simon.C 2011-05-18  
对保护自己的代码是有好处的!
21 楼 大神杨戬 2011-05-18  
确实没有很好的办法处理,我们目前的做法是:
团队内部约定自己的模块所有的返回值都不为null(特别是复杂对象),调用外部系统或方法产生的null用拦截器生成非null的值返回。

用断言并不能解决lz的问题,因为我们很多时候都需要如果出现null走到另外一个分支,而不是终止当前线程。
20 楼 jonesche 2011-05-18  
养成良好的编程习惯
19 楼 liu.anxin 2011-05-18  
公司内部统一, 尽量多使用公共工具类呗.
/**
 * 空字符串判断, <span style="color:red;">去左右空格后</span>, 如果为空返回 true<br/>
 * <span style="color:green;">为保证安全, 要事先定义好密码首尾是否能有空格</span>
 * 
 * @param param
 * @return boolean
 */
public static boolean isNull(CharSequence param) {
	return (param == null || "".equals(param.toString().trim()));
}


null 没必要置前, 那样的实际意义一样, 但感觉上让人非常别扭, "".equals 却很有必要, 不然会 NullPoint.
18 楼 hzl7652 2011-05-18  
可以参考使用spring提供的Assert
Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回。类似的,当我们在编写类的方法时,也常常需要对方法入参进行合法性检查,如果入参不符合要求,方法将通过抛出异常的方式拒绝后续处理。举一个例子:有一个根据文件名获取输入流的方法:InputStream getData(String file),为了使方法能够成功执行,必须保证 file 入参不能为 null 或空白字符,否则根本无须进行后继的处理。这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测的代码,如下所示:

public InputStream getData(String file) {
     if (file == null || file.length() == 0|| file.replaceAll(" \\s ", "").length() == 0) {
         throw new IllegalArgumentException("file入参不是有效的文件地址");
     }

}
  


类似以上检测方法入参的代码是非常常见,但是在每个方法中都使用手工编写检测逻辑的方式并不是一个好主意。阅读 Spring 源码,您会发现 Spring 采用一个 org.springframework.util.Assert 通用类完成这一任务。

Assert 翻译为中文为“断言”,使用过 JUnit 的读者都熟知这个概念,它断定某一个实际的运行值和预期想一样,否则就抛出异常。Spring 对方法入参的检测借用了这个概念,其提供的 Assert 类拥有众多按规则对方法入参进行断言的方法,可以满足大部分方法入参检测的要求。这些断言方法在入参不满足要求时就会抛出 IllegalArgumentException。下面,我们来认识一下 Assert 类中的常用断言方法:

断言方法 说明
notNull(Object object)  当 object 不为 null 时抛出异常,notNull(Object object, String message) 方法允许您通过 message 定制异常信息。和 notNull() 方法断言规则相反的方法是 isNull(Object object)/isNull(Object object, String message),它要求入参一定是 null;
isTrue(boolean expression) / isTrue(boolean expression, String message)  当 expression 不为 true 抛出异常;
notEmpty(Collection collection) / notEmpty(Collection collection, String message)  当集合未包含元素时抛出异常。notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分别对 Map 和 Object[] 类型的入参进行判断;
hasLength(String text) / hasLength(String text, String message)  当 text 为 null 或长度为 0 时抛出异常;
hasText(String text) / hasText(String text, String message)  text 不能为 null 且必须至少包含一个非空格的字符,否则抛出异常;
isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message)  如果 obj 不能被正确造型为 clazz 指定的类将抛出异常;
isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message)  subType 必须可以按类型匹配于 superType,否则将抛出异常;

使用 Assert 断言类可以简化方法入参检测的代码,如 InputStream getData(String file) 在应用 Assert 断言类后,其代码可以简化为以下的形式:

public InputStream getData(String file){
     Assert.hasText(file,"file入参不是有效的文件地址");
     ① 使用 Spring 断言类进行方法入参检测

}
  


可见使用 Spring 的 Assert 替代自编码实现的入参检测逻辑后,方法的简洁性得到了不少的提高。Assert 不依赖于 Spring 容器,您可以大胆地在自己的应用中使用这个工具类
17 楼 nighty 2011-05-18  
用一下commons-lang进行简化
16 楼 sadawn 2011-05-18  
ASSERT
NullObject
Aop???
装饰器???

相关推荐

    还在用if(obj!=null)做非空判断,带你快速上手Optional

    主要介绍了还在用if(obj!=null)做非空判断,带你快速上手Optional,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java if判断字符串非空.docx

    1 public static void main(String[] args) { 2 String s = null; 3 String c = " "; 4 String a = new String(""); 5 String b = new String(""); 6 System.out.println("s:" + s)... 9 //根据内存地址判断 false

    LocalDateTimeUtil.java

    import java.time.LocalDateTime;... }else if(type == 2){ //获取小时 date = LocalDateTime.now().minusHours(i); }else if(type == 3){ //获取分钟 date = LocalDateTime.now().minusMinutes(i);

    JS中判断字符串存在和非空的方法

    if(typeof unknownVariable ==='string' && unknownVariable.length){ ... } 搞定了吗? 如果这个字符串是用new String() 创建的会如何呢?typeof 这个未知变量肯定是 object。你会怎么办? 你肯定还得先判断类型...

    freemarker判断对象是否为空的方法

    如果需要判断对象是否为空: &lt;#if name??&gt; …… &lt;/#if&gt; 当然也可以通过设置默认值${name!”}来避免对象为空的错误。如果name为空,就以默认值(“!”后的字符)显示。  对象user,name为user的属性的...

    jQuery实现批量判断表单中文本框非空的方法(2种方法)

    本文实例讲述了jQuery实现批量判断表单中文本框非空的方法。分享给大家供大家参考,具体如下: 方法一: [removed] /* * 批量验证表单非空 * 需要非空验证控件的样式class="mustadd" */ $(".mustadd").each...

    shell判断一个变量是否为空方法总结

    shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过” “引号引起来 #!/bin/sh para1= if [ ! -n $para1 ]; ...

    安卓讯飞调用离线合成语音

    // 非空判断 if (TextUtils.isEmpty(text)) { return; } int code = mTts.startSpeaking(text, mTtsListener); if (code != ErrorCode.SUCCESS) { if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) { ...

    浅谈C#9.0新特性之参数非空检查简化

    参数非空检查是缩写类库很常见的操作,在一个方法中要求参数不能为空,否则抛出相应的异常。比如: public static string HashPassword(string password) { if(password is null) { throw new ...

    C语言 条件判断详细介绍

    C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C 语言提供了以下类型的判断语句。点击链接查看每个语句的细节。   语句 ...

    JS判断非空至少输入两个字符的简单实现方法

    if (str.length &lt; 2) { dialog(提示, text:请输入至少两位字符, 300, auto, ); return false; } str = str.replace(/(^\s*)|(\s*$)/g, '');//去除空格; if (str == '' || str == undefined || str == null)...

    C语言菜鸟基础教程之判断

    (一) 先动手编写一个程序: #include int main() { if(1) ...C语言把判断语句中的任何非0或非空的值当作真。所以if(1), if(2), if(5), if(100), if(-10)的效果是一样的。 (二) 再编写一个程

    js验证表单 js验证表单

    2.:js判断汉字、判断是否汉字 、只能输入汉字 3:js判断是否输入英文、只能输入英文 4:js只能输入数字,判断数字、验证数字、检测数字、判断是否为数字、只能输入数字 5:只能输入英文字符和数字 6: js email验证 、js ...

    vb.net做的俄罗斯方块

    '在循环体中,先判断第y行是否是满的,是的话result增1,并把第y行上的所有小正方形下降一行.最后y递减1 '如果实现把第y行的所有小正方形下降一行:从第y行扫描至第0行,每扫描一行,把上一行的每个小正方形赋值给该行,...

    C#实现的数据结构源码

    if ((p == null) || (p.LChild == null)) { return null; } Node&lt;T&gt; tmp = p.LChild; p.LChild = null; return tmp; } //若p非空,删除p的右子树 public Node&lt;T&gt; DeleteR(Node&lt;T&gt; p) { if ((p == null)...

    表单验证大全

    if(document.a.b.value.length&gt;50) { alert&#40;"不能超过50个字符!"&#41;; document.a.b.focus(); return false; } } [removed] &lt;form name=a test()"&gt; &lt;textarea name="b" cols="40" wrap="VIRTUAL" ...

    js中判断文本框是否为空的两种方法

    //在这里我认为: name 代表的name 为 txtUser 的文本框 if(name.value.length==0){ alert&#40;“请输入用户名”&#41;; name.focus(); return false; }else{return true;} } //密码非空验证+确认验证 function ...

    二叉树的遍历与应用二叉链表

    依次访问所经过的节点,同时所经[节点的非空右孩子]进栈; 当找到没有左孩子的节点时,从栈顶退出该节点的双亲的 右孩子,此时,此节点的左子树已访问完毕; 在用上述方法遍历该节点的右子树,如此重复到栈空为止。 ...

    js判断登陆用户名及密码是否为空的简单实例

    if(form.username.value == ) { alert&#40;用户名不能为空!&#41;; form.username.focus(); return false; } if(form.password.value == ) { alert&#40;密码不能为空!&#41;; form.password.focus(); return false; } ...

    基于链表节点实现二叉树节点(Java源码)

    if (hasLChild()) height = Math.max(height, 1+getLChild().getHeight());//左孩子 if (hasRChild()) height = Math.max(height, 1+getRChild().getHeight());//右孩子 if (hasParent()) getParent()....

Global site tag (gtag.js) - Google Analytics