几种常见NPE_npe有哪些类型-程序员宅基地

技术标签: NPE  NullPointerException  

参考文章:http://www.cnblogs.com/mafly/p/trap.html

1、Map下的NPE

      直接上代码:

public class User {

    private Integer id;

    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
}

    public static void main(String[] args) {
        User user = new User();
        
        Map<Integer, Object> hashMap = new HashMap<>();
        hashMap.put(user.getId(), user.getName());
        
        Map<Integer, Object> concurrentHashMap = new ConcurrentHashMap<>();
        concurrentHashMap.put(user.getId(), user.getName());//这里出现NullPointerException
    }

      Map类集合K/V能不能存储null值的情况,如下表格:


2、foreach遍历集合删除元素

      在遍历集合时对元素进行add/remove操作要使用Iterator,使用for循环时会报错,一定会报错吗?看代码:


      情况2:

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        
        list.add("1");
        list.add("2");
        list.add("3");
        
        for(String str : list){
            if("2".equals(str)){
                list.remove(str);
            }
        }
        
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String temp = it.next();
            if("2".equals(temp)){
                it.remove();
            }
        }
        
        System.out.println(list.toString());
    }
      程序不会报错,貌似foreach只有操作倒数第二个元素才没问题。但是我们依然要注意不要在foreach循环里进行元素的remove/add操作。remove元素要使用Iterator方式,如果并发操作,需要对Iterator对象加锁。

3、Arrays.asList()数组转换集合

      这个工具类应该都用过,可以很方便的把数组转换为集合,但是一些细节需要注意:

    public static void main(String[] args) {
        String[] str = new String[]{"a","b"}; 
        List list = Arrays.asList(str);
        list.add("c");//报错
        
//        str[0] = "d";
        for(Object o : list){
            System.out.println(o);
        }
    }
      
      注意:Arrays.asList()把数组转换成集合时,不能使用其修改集合的相关方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。asList()的返回对象是一个Arrays内部类,并没有实现集合的修改方法。所以,如果需要修改集合,要在转换之前操作。还需要注意一点,在你转换后,再对数组的值进行修改,集合也会跟着变化。

4、toArray()集合转换数组

      当我们需要把一个集合转换成数组时,往往会调用toArray()方法,如果使用的是无参的方法,会报ClassCastException异常。

      原因:直接使用toArray()无参方法返回值只能是Object[]类,若强转成其它类型数组将会抛出异常。

      解决方案:使用<T> T[] toArray(T[] a);有参数这个方法,代码如下:


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lsq_java_4/article/details/72824625

智能推荐

npm使用国内淘宝镜像(最新地址)_npm最新淘宝镜像-程序员宅基地

文章浏览阅读5.1w次,点赞143次,收藏203次。我们前端程序员在使用使用国外的镜像源速度很慢并且容易下载失败,有时候需要尝试多次才有可能下载成功,很麻烦,但是可以切换为国内镜像源,下面我介绍下如何使用淘宝镜像源。通过上述的操作,我们可以轻松地配置和使用淘宝镜像来加速npm包的下载、安装和更新。_npm最新淘宝镜像

hive case when的选择顺序优先级问题_hive case when then-程序员宅基地

文章浏览阅读9.1k次,点赞6次,收藏9次。hive 中有case when 的语法是:case when 条件1 then 结果1when 条件2 then 结果2when 条件3 then 结果3......else 结果x end那如果被查询的行同时符合条件1和条件3呢?结果会是出现“结果1”还是“结果3”呢?根据测试,是符合结果1,原因是语句先“碰见” when 条件1 then 结果1这一句。如果语句改为:se..._hive case when then

中北网安实训笔记-(20200628)-域名信息、端口信息收集、nmap手册网址、敏感信息收集、GIT信息泄露_中北网络域名-程序员宅基地

文章浏览阅读232次。今天内容1.信息收集(收集目标所有可以收集的信息) 工具 客户端 网页端域名信息(子域名)站点信息端口信息敏感信息2.扫描探测(awvs xray)漏洞的入口点——————————————————PPT:域名解析过程:用户–>浏览器输入baidu.com -->浏览器DXS服务器缓存–>系统缓存dns服务器缓存C://windows/system32/drivers/etc/host–>dns服务器(发送请求)whois查询备案域名划分子域名_中北网络域名

c语言用fun函数求最大公约数,C语言程序设计第七次作业(示例代码)-程序员宅基地

文章浏览阅读707次。一、学习内容本次课学习了函数的基本知识,需要大家对如下知识点进行总结:1. 函数定义的基本格式,函数定义和函数原型(声明)的区别何在?2. 函数的调用方式有哪几种3. 什么是形参,什么是实参,函数调用时的参数传递机制是什么?二、实验内容1.定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐)2.求两个正整数的最..._调用fun函数求最大公约数

MyBatis-Plus实现多表联查(一对一,一对多使用)_mybatisplus一对多-程序员宅基地

文章浏览阅读3.8k次,点赞56次,收藏33次。在使用mybatis-plus开发需求的时候会发现对于大部分的业务场景来说都会使用到join来进行联表查询,但是mybatis-plus封装的 mapper 不支持 join,如果需要支持就需要自己手动去实现,给大家推荐一个好用的插件(Mybatis-Plus-Join(简称 MPJ)是一个 Mybatis-Plus的增强工具,在 MyBatis-Plus 的基础上只做增强不做改变,为简化开发、提高效率而生。_mybatisplus一对多

基于JAVA学生信息管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署-程序员宅基地

文章浏览阅读106次。基于JAVA学生信息管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署。springboot基于springboot和vue的酒店管理系统。springboot基于SpringBoot的自助旅游导航系统。springboot基于JSP的企业办公管理系统设计与实现。JSP宠物食品店系统的设计与实现sqlserver。ssm基于Java的幼儿早教系统软件的设计与实现。ssm基于vue的健康餐饮管理系统的设计与实现。ssm基于JAVA的求职招聘网站的设计与实现。

随便推点

JTable冻结列的简单实现_用jtable实现excel冻结列-程序员宅基地

文章浏览阅读2.8k次。JTable实现冻结列的示例_用jtable实现excel冻结列

highlight.js网页代码高亮插件左侧怎么展示行号_highlightjs/vue-plugin 行号-程序员宅基地

文章浏览阅读288次。前几天分享了一篇网页代码高亮插件highlight.js,效果还不错,因为highlight.js本身没有行号展示,对于观感和体验上来源还是有点不太友好哈,恩。这几天越看越难受,忍不了还是弄一下吧。操作完成,上面代码框展示的就是配置后的效果了,因为我不大喜欢侧那块灰色的条,所以在css里面注释了,因人而异吧,喜欢的可以自己打开试下效果。_highlightjs/vue-plugin 行号

xp系统怎么创建新宽带连接服务器地址,XP宽带连接怎么创建?-程序员宅基地

文章浏览阅读1.6k次。本文介绍了XP系统上创建宽带连接的方法;如果用户办理的是PPPoE(ADSL虚拟拨号)宽带业务,在未使用无线路由器的情况下,需要通过电脑上的“宽带连接”来拨号上网;如果有路由器,则不需要通过宽带连接来拨号上网了。下面本文详细介绍XP系统上创建宽带连接的方法。XP创建宽带连接1、右击“网上邻居”选择“属性”XP系统上网上邻居属性2、选择“创建一个新的连接”,如下图所示选择创建一个新的连接3、直接点击..._xp系统新设置宽带连接

.NET开发语言C++.NET, C#, VB.NET电子资料汇总-程序员宅基地

文章浏览阅读103次。Pro LINQ:Language Integrated Query in C# 2008MS Press - Introducing Microsoft LINQLINQ for Visual C# 2005 (07年6月出版)LINQ for VB 2005 (07年6月最新PDF文字版)Manning:LINQ in ActionPro C# 2008..._c++ c# vb.net

confluence搭建部署_ata confluence-程序员宅基地

文章浏览阅读1.1k次。confluence企业wiki搭建部署_ata confluence

SpringCloud与SpringBoot版本对应关系_springboot 2.1.1 对于的cloud-程序员宅基地

文章浏览阅读830次。今天在创建SpringCloud项目过程中遇到了一个坑:当我将SpringCloud项目架子搭好之后,启动Eureka的时候报错(具体的错误提示忘记截图了),然后对问题摸索了好久之后才发现是SpringBoot与SpringCloud对应的版本问题。由于我项目中SpringBoot项目的版本用的是2.2.X,而SpringCloud的版本用的是 Greenwich.SR2所以造成了报错导致Eur..._springboot 2.1.1 对于的cloud

推荐文章

热门文章

相关标签