凡是对集合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. HTTP抓包

    1 概述 wireshark:全平台抓包工具,需要图形化界面,十分强大: httpry:http抓包插件,功能一般,操作简单: tcpdump:强大的抓包插件,支持多种网络协议. 2 httpry ( ...

  2. C#多线程的简单理解

    一.CLR线程池基础 创建和销毁线程是一个昂贵的操作,所以CLR管理了一个线程池(thread pool),可以将线程池看成一个黑盒. CLR初始化时,线程池中是没有线程的.线程的初始化与其他线程一样 ...

  3. opencv 加载pb

    1.错误1         Tensor's data type is not supported the type of Mul  is DF_Float 2.  错误2 type == " ...

  4. 服务器去掉IE浏览器网络安全限制

  5. leetcode-111. 二叉树最小深度 · Tree + 递归

    题面 找出二叉树的最小深度(从根节点到某个叶子节点路径上的节点个数最小). 算法 算法参照二叉树的最大深度,这里需要注意的是当某节点的左右孩子都存在时,就返回左右子树的最小深度:如果不都存在,就需要返 ...

  6. 【vue开发】vue插件的install方法

    MyPlugin.install = function (Vue, options) { // 1. 添加全局方法或属性 Vue.myGlobalMethod = function () { // 逻 ...

  7. AlterDialog对话框的使用

    第一步先写出layout文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  8. nginx搭建反向代理服务器详解

    一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...

  9. MySQL学习笔记-MHA安装配置

    一.配置主从同步   1. 本例中主从ip及端口 Master:10.1.5.8:3306 Slave1:10.1.5.9:3306 (候选master) Slave2:10.1.5.195:3306 ...

  10. Hosts 长期更新【已停】

    修改hosts篇 [2018.1.3] 由于google的对应的hosts更新过于频繁,再加上上次(18+1)大之后,国家政策原因,网上hosts更新基本上都停了,github的项目也陆续挂掉了. 还 ...