`
chenchuan
  • 浏览: 18056 次
  • 性别: 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

    * of() 方法:用于创建一个非空的 Optional 实例,例如 `Optional&lt;String&gt; optional = Optional.of("Hello");` * ofNullable() 方法:用于创建一个可能为空的 Optional 实例,例如 `Optional&lt;String&gt; optional = ...

    java if判断字符串非空.docx

    在Java编程中,判断字符串非空是一个常见的任务,特别是在处理用户输入或数据验证时。从提供的代码示例中,我们可以看到几种不同的方法来检查字符串是否为空。这些方法包括使用基本的逻辑运算符、Apache Commons ...

    判断非空函数和使用实例

    在IT领域,尤其是在软件开发与编程中,“判断非空函数”是一个重要的概念,它涉及到对变量或对象状态的检查,确保其不为空或未被初始化。这种检查是防止程序运行时错误的关键步骤,特别是在处理数据库操作、用户输入...

    05.if判断_Pythonif判断_If..._

    在Python编程语言中,`if` 判断语句是实现条件控制的重要结构,它允许程序根据特定条件执行不同的代码块。本节将深入探讨`if`判断及其相关的语法和应用场景。 1. `if` 语句基本语法 Python中的`if`语句非常简洁,...

    sql server字符串非空判断实现方法

    总结来说,SQL Server中的字符串非空判断是通过`is null`或`is not null`条件来实现的,而在动态构建字符串时,可以通过`if`语句配合`is null`或`isnot null`以及`len`函数来避免空字符串的操作。同时,`isnull`函数...

    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中el表达式的使用和非空判断方法

    总结,本文介绍了如何在JavaScript中使用EL表达式来处理Spring MVC返回的JSON数据,以及如何进行非空判断和安全地解析JSON字符串。在实际应用中,需要注意避免使用`eval()`,因为它可能导致脚本注入攻击,而应优先...

    jquery前端非空验证

    jQuery,一个广泛使用的JavaScript库,提供了强大的功能来辅助前端开发者进行非空验证。本篇文章将深入探讨如何利用jQuery进行前端非空验证。 一、jQuery简介 jQuery是一个轻量级、高性能的JavaScript库,它简化了...

    PYTHON学习教程:条件判断(if、elif.、else代码练习print Run).docx

    也可以给if添加一个else语句,意思是,如果if判断是False,不要执行if的内容,去执行else的内容。else语句可以单独使用,也可以与if语句一起使用。 elif是else if的缩写,可以有多个elif语句。if语句的完整形式是:...

    JavaScript中通用的两个非空检测函数

    2. **逐个判断非空**:使用`if...else if...else`结构,对每个字段进行非空判断。 3. **错误提示与返回值**:如果发现某个字段为空,则弹出提示信息,并返回`false`阻止表单提交;如果所有字段都填写了,则返回`true...

    JAVA日期判断方法小结

    该方法使用 substring 方法将日期字符串分割成年、月、日三个部分,并使用Integer.parseInt方法将其转换为整数,然后使用if语句判断日期的合法性。 4. 根据给定的日期计算两个日期之间的天数 根据给定的日期计算两...

    velocity为空判断

    #### 判断非空: 直接使用变量$xxx,如果变量存在并且不为空,那么`#if ($xxx)`的条件将为true。例如: ```velocity #if ($xxx) 变量$xxx有值 #else 变量$xxx为空或不存在 #endif ``` 需要注意的是,`#if (!$...

    if语句练习题目

    这里利用了字符串的切片功能来检查正反两个方向的数是否相同,`if`语句用于作出判断并输出结果。 ### 总结 通过这些练习题目,我们不仅加深了对`if`语句的理解,还学会了如何将它应用于实际问题的解决中。`if`语句...

    还在用if(obj-=null)做非空判断?带你快速上手Optional实战性理解-.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

    freeMark if嵌套

    在FreeMarker中,`&lt;#if&gt;`语句用于进行条件判断,如果表达式的值为真,则执行相应的代码块。在某些情况下,我们可能需要在`&lt;#if&gt;`语句内部再嵌套`&lt;#if&gt;`,这就是所谓的`if`嵌套。 首先,让我们理解`&lt;#if&gt;`的基本语法...

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

    在JavaScript(JS)中,判断一个变量是否为字符串并确保其非空,是一个常见的需求,尤其是在处理用户输入或从API获取数据时。本篇文章将详细探讨如何有效地进行这种检查,并指出其中的一些陷阱和注意事项。 首先,...

    javascript if条件判断方法小结

    JavaScript中的if条件判断是编程中常用的一种控制流程语句,用于基于不同的条件来执行不同的代码块。当编写代码需要根据不同情况做出决策时,条件语句是非常重要的工具。 在JavaScript中,主要的条件语句包括if语句...

    shell浅谈之二 运算符和if条件判断

    在Shell脚本编程中,运算符和if条件判断是核心组成部分,它们允许脚本根据不同的条件执行相应的操作。本文将详细探讨这些概念。 首先,我们要理解`if`条件判断是控制流程的重要工具,它允许程序根据指定的条件来...

    python if-else 写在一行(csdn)————程序.pdf

    if any(inputs): # 判断列表非空 for t in inputs: if t temp.append(t) else: temp.append(None) res.append(temp) ``` 这里,`any(inputs)`用于检查列表是否为空,如果列表非空,则遍历列表元素,根据条件...

Global site tag (gtag.js) - Google Analytics