在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基础入门- 运算符与判断语句

JAVA语言中常用的运算符可以分为以下几种 算术运算符、赋值运算符、比较运算符、逻辑运算符、条件运算符 Java中的算术运算符 算术运算符主要用于进行基本的算术运算,如加法、减法、乘法、除法...
  • qq_33369215
  • qq_33369215
  • 2016年07月11日 21:06
  • 3757

java判断与循环语句

程序语句的三种结构 1.顺序结构 2.选择结构 3.循环结构 3.1顺序结构 3.2选择结构 举例:验证选择结构 public class IfDemo{ ...
  • e421083458
  • e421083458
  • 2012年11月02日 21:34
  • 9574

Java中判断字符串是否为数字的五种方法

推荐使用第二个方法,速度最快。  方法一:用JAVA自带的函数  Java代码   public static boolean isNumeric(String str)...
  • jinwufeiyang
  • jinwufeiyang
  • 2016年08月25日 20:10
  • 4836

【笔试】Java判断一个正整数是否为质数(素数)。

最近做了好几套笔试题目,发现许多笔试题里都有对质数(素数)的相关操作。现将基本的用Java判断某个数为质数(素数)的方法贴在这。以后笔试过程中遇到的问题也做一下记录。这是第一篇。先贴出方法代码,后有解...
  • Ahem_
  • Ahem_
  • 2017年03月25日 19:02
  • 5839

java 判断对象是否是某个类的类型两种方法

一、 instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。  用法: ...
  • qq_27376871
  • qq_27376871
  • 2016年07月07日 10:15
  • 17638

java 判断对象是否为空

java 中如何判断一个未知对象是否为空呢? 下面是一个通用的方法,判断字符串是否为空,集合是否为空,数组是否为空: Java代码   /**       * 判断对象或对象数组中每一个对...
  • youyou_yo
  • youyou_yo
  • 2015年07月29日 17:01
  • 9300

【Java】对于空值null的判断

在大型程序开放过程中,无论是SSH还是安卓,都需要对空值进行判断,尤其是某个实体传递过来的值,但是,往往对于null的判断条件没写好,导致空指针异常。 对于任意的Object,判断其是否为null,...
  • yongh701
  • yongh701
  • 2015年07月28日 18:26
  • 10563

Java中判断String不为空的问题

一、判断一个字符串str不为空的方法有:   1. str!=null;   2. "".equals(str);   3. str.length()!=0;   ( 注意:length是属...
  • yong472727322
  • yong472727322
  • 2015年12月30日 16:47
  • 8305

使用ArrayList时的注意事项:去除多余的null值

问题描述:在课表导入的时候,将数据从excel表里读出,然后将list批量插入到对应的课程表的数据表单中去,出现结果:当我们导入3条数据时,list.size()为3,但是实际上,list里面存在10...
  • LiMing_0820
  • LiMing_0820
  • 2017年08月31日 11:35
  • 564

Java中如何避免麻烦的null值判断

面向对象语言中经常要对null值进行判空处理,造成代码很冗余,且容易出错,本文中介绍了两种对null值的处理方法,使得代码更简短和严谨。...
  • timchen525
  • timchen525
  • 2017年07月13日 22:30
  • 617
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Java代码中避免 "!=null " 判断
举报原因:
原因补充:

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