在Java代码中避免 "!=null " 判断

翻译 2015年07月06日 18:48:07
这对于我来说是一个很合理常见的问题,由初级过度到中级程序员的时候经常会遇到。他们不知道也不信任正在用的约定,并且小心的检查着null。还有当他们写代码的时候,总是会依赖于通过返回空(NULL)来表明某些意义,因此需要调用者去检查Null。
换种方式来说,有两种情景空指针的检查会出现:
  1. 就约定来说是一个合理的响应
  2. 不是合理的响应  
第二种很简单,可以通过用assert或者直接允许失败,例如NullPointerException。Assertions是一个从Java1.4加进来的高度未被利用的特性,语法是:
assert <condition>
或者
assert <condition> : <object>
condition是一个布尔表达式,object是一个对象(其toString()方法的输出将会被包含在错误里)。
如果condition为false的话,assert将会抛出一个Error(AssertionError).
默认Java会忽略断言你可以通过在JVM中传入一个-ea参数来启用断言,
你可以为单独的一个包或者类启动关闭assertions。这意味着你可以在开发和测试的时候通过断言来验证代码,
在发布产品的时候关闭它,尽管我下面展示的测试中并没有因为assertions而损失性能。
在这个代码段中不用断言也可以,因为他会运行失败的,就像加了断言一样。唯一的区别是
有了断言可能会发生的更快一些,更有意义,并且会附加一些额外的信息,而这可以帮助你弄明白
失败的原因。
第一种有一点棘手。如果你对不能控制正在调用的这段代码,那你就卡住了。
如果Null是一个合理的返回值,你就应该检查它。
如果是你能够控制的代码,那就是个完全不同的故事情景了.尽量避免用NULL作为返回值。
对于返回Collections的集合很容易,返回Empty(一个空集合或者数组),而不是一直用null作为返回值。
对于不是返回Collections的方法会有一点复杂。考虑下面这个例子:
public interface Action {
  void doSomething();
}

public interface Parser {
  Action findAction(String userInput);
}
Parser采用用户的输入作为参数,然后做一些事情(例如模拟一个命令行)。现在你可能会
返回null,如果没找到对应输入的动作的话,这就导致了刚才说过的空指针检查。
一个可选的解决方案是永远不要返回null,而是返回一个空对象
public class MyParser implements Parser {
  private static Action DO_NOTHING = new Action() {
    public void doSomething() { /* do nothing */ }
  };

  public Action findAction(String userInput) {
    // ...
    if ( /* we can't find any actions */ ) {
      return DO_NOTHING;
    }
  }
}
比较这段代码:
Parser parser = ParserFactory.getParser();
if (parser == null) {
  // now what?
  // this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
  // do nothing
} else {
  action.doSomething();
}
和这段:
ParserFactory.getParser().findAction(someInput).doSomething();
这是个更好的设计,因为足够简洁,避免了多余的判断。即便如此,或许比较合适的设计是:findAction()方法之恶杰抛出一个异常,其中包含一些有意义的错误信息-----特别是在这个案例中你依赖于用户的输入。让findAction()方法抛出一个异常而不是简单的产生一个没有任何解释的NullPointerException 要好得多。
try {
    ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
    userConsole.err(anfe.getMessage());
}
或者你认为try/catch 的机制太丑了,你的action应该跟用户提供一个反馈而不是什么都不做:
public Action findAction(final String userInput) {
    /* Code to return requested Action if found */
    return new Action() {
        public void doSomething() {
            userConsole.err("Action not found: " + userInput);
        }
    }
}
原文来自StackOverflow:http://stackoverflow.com/questions/271526/avoiding-null-statements-in-java

java--关于非空判断的小技巧

最近经常在做表单数据提交的处理,所以经常要对提交的数据进行格式检查,而非空判断在这里就是必不可少的了。 但是有时候需要值比较和非空在一起判断的话就需要格外注意了(我这里问题出现在取表单select标...

null或空值的判断处理-java

1,错误用法一: if (name == "") {      //do something }2,错误用法二: if (name.equals("")) {      //do somet...
  • Ghost_T
  • Ghost_T
  • 2010年08月14日 09:54
  • 67668

JAVA中isEmpty和null以及""的区别

这是一个比较容易混淆的概念,为了弄清楚这个问题,最好的方法当然是写程序来验证,上代码吧~~: /** * */ package JavaTest; /** * @author wxweve...

java中null与""的区别

简单点说null表示还没new出对象,就是还没开辟空间  “”表示new除了对象,但是这个对象装的是空字符串。 比如声明一个 String str ; 如果说str是null,那么内存根本没创建...

Java中null与数据库的NULL的认识

java和数据库中null、NULL的认识                                                    java和数据库中null、NULL的认识 Ja...

java应用避免NullPointerException的最佳方法@NotNull的使用

java应用避免NullPointerException的最佳方法@NotNull的使用

你真的理解java中的null“类型”吗?

本文先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null“类型”进行解读。 题目:下面程序能正确运行吗? 解析:输出应该为 :haha...

为什么java里面经常作判断的时候,既要判断list不为null,又要判断size>0呢,岂不是多此一举吗?

1、看来是初学者。 2、List list=new ArrayList(); 这样的list不为null,但是size=0,这样的集合对于之后的判断是没用的,甚至是报异常,如list.ge...

Java中null或空值的判断处理

Java中null或空值的判断处理

【Java】对于空值null的判断

在大型程序开放过程中,无论是SSH还是安卓,都需要对空值进行判断,尤其是某个实体传递过来的值,但是,往往对于null的判断条件没写好,导致空指针异常。 对于任意的Object,判断其是否为null,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Java代码中避免 "!=null " 判断
举报原因:
原因补充:

(最多只允许输入30个字)