凡是对集合list,set,map,数组等进行循环一定要判断是否为null,增强代码的健壮性。下面以list为例,
使用for循环遍历list对象,处理其中的元素时,需要对null值判断:
1、list为null时,抛空指针异常;
2、list不为null,但是list.size()=0时,不执行for循环内代码块;
3、list.size()>0,执行for循环,但循环的对象可能为null,也需要判断。

public static void main(String[] args) {
printEachList(1);
printEachList(2);
printEachList(3);
printEachList(4);
standardPrintStyle();
} //标准写法
private static void standardPrintStyle() {
int key = 2;
List<Long> list = getList(2);
if (null != list) {//只需要判断null,size=0时不会执行for循环 for (Long temp : list) {
if (null == temp) {//temp可能为null,表示list元素指向的对象为null对象,但是元素的值(null对象的引用)不为空
System.out.println("遇到对象为null,跳过");
continue;
}
System.out.println(String.format("key_%d:%s", key, temp.toString()));
}
}
} private static void printEachList(int key) {
List<Long> list = getList(key);
try {
for (Long temp : list) {
System.out.println(String.format("key_%d:%s", key, temp.toString()));
}
} catch (Exception e) {
System.out.println("list是否为null --》" + CollectionUtils.isEmpty(list));
System.out.println(String.format("key_%d error:%s", key, e));
}
} private static List<Long> getList(int key) {
List<Long> list = null;
switch (key) {
case 1:
list = new ArrayList<Long>();
list.add(1L);
list.add(2L);
break;
case 2:
list = new ArrayList<Long>();
list.add(null);
list.add(1L);
break;
case 3:
list = new ArrayList<Long>();
break;
default:
break;
}
return list;
}

执行结果:

key_1:1
key_1:2
list是否为null --》false
key_2 error:java.lang.NullPointerException
list是否为null --》true
key_4 error:java.lang.NullPointerException
遇到对象为null,跳过
key_2:1
下面加深一下对Java List集合为空还是为null的理解。
 
1. 判断一个list集合是否为空
   在Java中,list集合为空(集合中无元素)与为null是两码事。
   举例,我有一个空着的水杯(cupList),而你没有,那你是null,我的size为0。你想装水就需要自己去买个水杯(new ArrayList();),但是我就可以直接装水(cupList.add(水))。你要是没有杯子直接倒水,水就流出去啦(空指针异常)。 
2. 什么时候用isEmpty()或list.size() 
   isEmpty() 或者(list.size() == 0)用于判断list内容是否为空,即集合中是否存在元素,例如,cupList中是否有水。但是,使用isEmpty()和size()的前提是,list是一个空集合,而不是null,所以为了避免异常,建议在使用或赋值list集合之前,做一次空集合创建处理,进行内存空间分配,即:List list = new ArrayList(); 
   isEmpty()判断有没有元素,而size()返回有几个元素,如果判断一个集合有无元素,建议用isEmpty()方法,看起来清晰明了。 
3. list等于null,可理解为没有对list集合分配内存空间,实际上压根就不存在。
 
if(list!=null && !list.isEmpty()){
//在这个里操作list
}else{
//做其他处理
}
 
Reference
 

List对象遍历时null判断逻辑梳理的更多相关文章

  1. List对象遍历时null判断

    使用for循环遍历list处理list元素时,对null值判断: 1.list为null时空指针异常 2.list不为空,但是list.size()=0时,不执行for循环内代码块 3.list.si ...

  2. Java判断对象是否为NULL

    Java使用反射判断对象是否为NULL 判断Java对象是否为null可以有两层含义: 第一层:  直接使用 object == null 去判断,对象为null的时候返回true,不为null的时候 ...

  3. Java判断对象是否为Null/空

    package com.taiping.test; import java.lang.reflect.Field; import java.lang.reflect.Type; /** * <p ...

  4. 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用

    一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...

  5. 链判断运算符和Null 判断运算符

    链判断运算符 如果我们要获取一个对象的深层嵌套属性,例如获取文章标题res.data.article.title,然后为了安全起见,我们肯定不能直接这样获取,万一res对象没有article属性了呢, ...

  6. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  7. C#检查foreach为null判断

    1.foreach遍历列表或数组时,如果list或数组为null,就会报错,如下图: 2.不知道微软封装foreach的为什么不先检查要遍历的对象是否为null,这样就导致,我们在写代码时,遍历列表时 ...

  8. 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

  9. 检查对象是否为NULL或者为Empty

    不管是在Winform开发,还是在asp.net 开发中当从一个数据源中获取数据时你总是不知道这个数据的状态,这个时候总要对她进行一次判断,不过每次进行一次判断总是要写怎么一堆代码,时间长了,总感觉不 ...

随机推荐

  1. (六)lucene之其他查询方式(组合查询,制定数字范围、指定字符串开头)

    本章使用的是lucene5.3.0 指定数字范围查询 package com.shyroke.test; import java.io.IOException; import java.nio.fil ...

  2. JS中的兼容性问题

    事件对象兼容        window.event只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.Firefox必须从源处加入event作 ...

  3. nginx加入开机自启动

    1.首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令:(vim /etc/init.d/nginx) 2.在/etc/init.d/nginx中写入以下脚本代码 ...

  4. JS Array.reverse 将数组元素颠倒顺序

    <pre><script type="text/javascript"> //JS Array.reverse 将数组元素颠倒顺序//在JavaScript ...

  5. jquery中的ajaxSetup

    在项目开发中如果我们想给某一个页面中的所有的ajax设置统一的参数的情况下,可以是使用ajaxSetup,非常好用 $.ajaxSetup({ type:'post', dataType:'json' ...

  6. 什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

    什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

  7. SQL Server CET 通用表表达式 之 精典递归

    SQL2005 Common Table Expressions(CET)即通用表表达式. SQLSERVER CET递归使用案例: 1.普通案例 表结构如下:   ;WITH cet_depart ...

  8. 微信小程序将图片数据流添加到image标签中

    原文:https://blog.csdn.net/OliveLao/article/details/78136121 ---------------------------------------- ...

  9. Oracle-锁的查询和处理

    1.查出锁定object的session的信息以及被锁定的object名 SELECT L.SESSION_ID SID, S.SERIAL#, L.LOCKED_MODE, L.ORACLE_USE ...

  10. oracle 给表字段把VARCHAR2 换成 CLOB

    select * from TableName -- 添加一个字段 alter table TableName add 字段2 clob; --复制数据到此字段update TableName set ...