但行好事
莫论前程❤

Java基础学习总结—-非空判断

java基础学习总结—-StringUtils方法详解

// 1、String的非空判断。
StringUtils.isNotEmpty(String str);  //方法一
if(s == null || s.length() == 0);    //方法二
if(s == null || s.isEmpty());        //方法三 jdk1.6才支持.
                                     //  注意isEmpty()方法是String的,不是StringUtils.区别见下文

// 2、Integer(包装类)的非空判断。
null != Integer ;  null == Integer ;

//3、list的大小判断。
list.size() == 0

//4、对象的非空判断
null != object;  null == object  

从刚开始学编程就经常会看到许多地方有类似 if(XX==null)之类的语句,总觉得有点不解,直到现在开始参与项目才懂得非空判断的意义与重要性,觉得自己对null和其他空值的理解太过模糊,于是系统的学习了一下,写个总结,希望可以对有同样需求的人有一定参考作用。

  • 1.空值有哪些类型
  • 2.为什么要做空判断
  • 3.用return减少嵌套

什么叫空指针异常

  • NullPointerExceptionRuntimeException派生出来,是一个运行级别的异常。意思是说可能会在运行的时候才会被抛出,而且需要看这样的运行级别异常是否会导致你的业务逻辑中断。
  • 空指针异常发生在对象为空,但是引用这个对象的方法。
  • 一个变量是null,即只有其名,没有实值内容,也没分配内存,当你要去取他的长度,对他进行操作就会出现NullPointException,所以声明一个变量时最好给它分配好内存空间,给予赋值。
  • 比如变量为空,而你没有去判断,就直接使用,就会出现NullPointException。
  • 尽量避免返回null,方法的返回值不要定义成为一般的类型,而是用数组。这样如果想要返回null的时候,就返回一个没有元素的数组。就能避免许多不必要的NullPointerException,使用NullObject返回代替返回null确是一种不错的选择。

空值有哪些类型

一般来说空值是指null,但是只判断null并不能解决所有问题,除了常见的空字符串,长度为0数组,还有其他一些基本数据类型的默认值等。所以这里说的空值并不仅限严格意义上的空值,包括了其他可能代表无数据、没有值或者需要判断的情况。

1、 基本数据类型

对于八种基本类型来说去判断==null是错误的,因为基本类型的取值范围并没有null,即使声明后没有进行赋值Java也会根据不同类型给予初始值,整数类型int、byte、short、long的默认值为0,带小数点的float、double默认值为0.0,boolean的默认值为false,char的默认值是‘’

所以判断的参数是八种基本类型时应该注意不能判断==null应该根据类型选择对比的值,虽然直接使用这些默认值不像null会引起空指针异常,但是作为数据是否被有效赋值的判断在很多情况下也是必要的。

常见数据类型对应需要判断的空值

类型所属空值、默认值或可能需要处理的值
int基本数据类型0
float、double基本数据类型0.0
String引用数据类型null、””
数组容器类null、{}、{null}、{0,0} 等等
List容器类null、内部元素为null
public static void main(String[] args) {
       User user = new User();
       long biz = find.getData2();

//       if(biz == null){
//           System.out.println("biz == null");
//       }

        if(biz == 0){
            System.out.println("biz == 0");
        }

//        if(biz == "null"){
//           System.out.println("biz =='null'");
//         }

    //System.out.println(StringUtil.isEmpty(biz));//异常,connot be applied to
    System.out.println(StringUtil.isBlank(biz));;//false
conditionsbiz == nullbiz == “null”biz == 0
Long biz = find.getData1();异常异常

2、包装类

对于包装类的数据,直接用==null判断

Long包装类测试
public static void main(String[] args) {
       User user = new User();
       Long biz = find.getData1();
       if(biz == null){
           System.out.println("biz == null");
       }

        if(biz == 0){
            System.out.println("biz == 0");
        }

        if(("null").equals(biz)){
            System.out.println("('null’).equals(biz)");
        }
conditionsbiz == nullbiz == “null”biz == 0
Long biz = find.getData1();异常NullPointerException
Date测试
 public static void main(String[] args) {
       User user = new User();
       Date biz = user.getDate();
        if(biz == null){
           System.out.println("biz == null");
       }

        if(("").equals(biz)){
            System.out.println("('').equals(biz)");
        }

//        if(biz == "null"){
//           System.out.println("biz =='null'");
//         }

        if(("null").equals(biz)){
            System.out.println("('null’).equals(biz)");
        }

    }
    System.out.println(StringUtil.isEmpty(biz));//connot be applied to
    System.out.println(StringUtil.isBlank(biz));;//true
conditionsbiz == nullbiz == “null”
Long biz = find.getData1();异常,connot apply to Date,string

引用数据类型

当我们声明一个非基本数据类型变量,而不进行赋值的情况下,java会自动赋值null所以当我们去调用这个未赋值变量的方法,或者访问其内部变量的时候就会抛出空指针异常,也是最常见需要if(xxx==null)语句的情况。比较值得注意的是有一些具有内部对象的模型类,要考虑到内部对象是否为null的情况。

1、 String

String虽然也是继承自Object,默认值也为null,但是对于常见的应用场景,空串""也是我们应该进行判断的情况。可以用:

Java空字符串与null的区别:

1、类型

  • null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;
  • ""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = “” ;

2、内存分配

  • String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;
  • String str = ""; 表示声明一个字符串类型的引用,其值为””空字符串,这个str引用指向的是空字符串的内存空间;

在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap):

就如下:

String str = new String("abc") ;

ps:=左边的是存放在栈中(stack),=右边是存放在堆中(heap)。

3、示例程序:

public class String_Demo01 {

    /**
     * @param args
     */
    public static void main(String[] args) {        
        String str1 = new String() ;
        String str2 = null ;
        String str3 = "" ;
        System.out.println(str1==str2);                //内存地址的比较,返回false
        System.out.println(str1.equals(str2));         //值的比较,返回false
        System.out.println(str2==str3);                //内存地址的比较,返回false
        System.out.println(str3.equals(str2));         //值的比较,返回false
        System.out.println(str1==str3);                //内存地址的比较,返回false
        System.out.println(str1.equals(str3));         //值的比较,返回true
    }

}

通过如上的程序可以得出如下结论:

  • 字符串对象与null的值不相等,且内存地址也不相等;
  • 空字符串对象与null的值不相等,且内存地址也不相等;
  • new String()创建一个字符串对象的默认值为”” (String类型成员变量的初始值为null)

以下是java 判断字符串是否为空的四种方法:

  • 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低:

if(s == null || s.equals(""));

  • 方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法:

if(s == null || s.length() == 0);

  • 方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二.

if(s == null || s.isEmpty());

  • 方法四: 这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多:

if (s == null || s == "");

  • 方法五:

    StringUtils.isNotEmpty();

  // 目前StringUtils有两个版本可用,分别是较新的org.apache.commons.lang3.StringUtils和较老的org.apache.commons.lang.StringUtils,他们有比较大的区别,前者需要JAVA 5,我想这个应该是我们希望使用的。 


  // StringUtils源码
  public static boolean isEmpty(String str) {
          return str == null || str.length() == 0;
  }

  public static boolean isNotEmpty(String str) {
          return !StringUtils.isEmpty(str);
  }

// String源码 对比于StringUtils源码
 public boolean isEmpty() {
        return value.length == 0;
 }

注意:s == null 是有必要存在的.

  如果 String 类型为null, 而去进行 equals(String) 或 length() 等操作会抛出java.lang.NullPointerException.

  并且s==null 的顺序必须出现在前面,不然同样会抛出java.lang.NullPointerException.

  如下Java代码:

  String str = null;
  if(str.equals("") || str == null){//会抛出异常
            System.out.println("success");
  }

容器类

1 、数组

基本上有4种情况:

  • 1 声明但不定义长度,值为null
  • 2 长度为0数组,不为null,但注意不可直接取出元素,会抛出索引越界错误(ArrayIndexOutOfBoundsException)
  • 3 基本类型数组声明且定义长度,但不赋值,所有元素值为该基本类型默认值
  • 4 引用类型数组声明且定义长度,但不赋值,所有元素为null
    int[] arrayNull;  //值为null
    int[] arrayZero = new int[0]; //值为{}
    int[] arrayInt = new int[2];  //值为{0,0}
    Object[] arrayObj = new Object[2];  //值为{null,null}

2 、集合

  • 不赋值的情况下为null
  • List:允许重复元素,可以加入任意多个null。
  • Set:不允许重复元素,最多可以加入一个null。
  • Map:Map的key最多可以加入一个null,value字段没有限制。

为什么要做空判断

  • 增加程序性能
  • 避免空指针异常

用return减少嵌套

使用非空判断的时候因为要使用到if–else语句,不免要多出一些嵌套,当逻辑比较简单的时候还好,如果复杂一点的逻辑就可能要使用到多重嵌套,看着一堆迷之缩进是很影响代码可读性的,所以从小养成用return语句减少嵌套的习惯是很重要的。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.txt);
    if (getArticle().getComment() == null) {
      //把else里的语句 放到里面 最后加上return 跳过后面语句
      textView.setText("暂时没有评论");
      return;
    }
    String commentContent = getArticle().getComment().getContent();
    textView.setText(commentContent);
  }
赞(1) 打赏
未经允许不得转载:刘鹏博客 » Java基础学习总结—-非空判断
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏