几种常见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

智能推荐

Android 监听音频焦点变化-程序员宅基地

文章浏览阅读468次,点赞22次,收藏16次。在 Android 中,监听音频焦点变化意味着您可以获得关于音频焦点状态的通知,并针对焦点变化执行相应的操作。音频焦点是指哪个应用程序或组件有权播放音频的能力。

Linux基础之初识SHELL脚本_shell脚本-gf-程序员宅基地

文章浏览阅读10w+次。Shell脚本(Shell Script )可以简单理解为多个LINUX命令的堆砌,与Windows/Dos下的批处理相似_shell脚本-gf

IPD思想指导下的企业研发管理成熟度演进模型-程序员宅基地

文章浏览阅读2.4k次。基于IPD研究(书籍、网络文章、个人实践),参考CMMI框架,输出本研发管理能力成熟度框架。_研发管理成熟度

linux下Js加载so,JavaScript文件加载器LABjs API详解-程序员宅基地

文章浏览阅读478次。在《高性能JavaScript》一书中提到了LABjs这个用来加载JavaScript文件的类库,LABjs是Loading And Blocking JavaScript的缩写,顾名思义,加载和阻塞JavaScript,而它的API script()和wait()则优雅地实现了这两个功能,我在高性能JavaScript 加载和执行一文中也简单讲解了这两个核心API的用法。当然,LABjs还有更多..._so打包到js

Rancher 1.6 实战-程序员宅基地

文章浏览阅读1.7k次。为什么80%的码农都做不了架构师?>>> ..._rancher 1.6

Pycharm+Anaconda 之jupyter notebook内核配置,解决内核不匹配等错误_笔记本内核和代码不匹配-程序员宅基地

文章浏览阅读5.8k次,点赞9次,收藏26次。首先确保已经安装了annaconda和pycharm软件,可百度相关教程。1.安装notebook在独立anaconda环境中,假设环境名为Jupyter,安装notebook,已安装的见下一步。(Jupyter) E:\Pywork> conda install notebook # 或 pip install notebook2.检查ipython是否安装默认安装jupyter notebook包时会安装关联的ipython包,为确保此处无问题,可以检查一下,在Jupyter_笔记本内核和代码不匹配

随便推点

sonar-程序员宅基地

文章浏览阅读61次。1.maven的setting.xml中<profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <proper...

linux mysql源,linux 安装 mysql8+ rpm源方式-程序员宅基地

文章浏览阅读137次。系统 更新yum upgrade卸载rpm -qa|grep -i mysqlrpm -ev mysql-community-common-5.7.27-1.el7.x86_64 mysql-community-server-5.7.27-1.el7.x86_64 mysql-community-server-5.7.27-1.el7.x86_64 mysql-community-libs-5.7..._yum拉取msyql8的rpm源

Java Reflection Tutorial for Classes, Methods, Fields, Constructors, Annotations and much more_reports all fields methods 哦日期classes,found in the-程序员宅基地

文章浏览阅读1k次。Reflection in java provides ability to inspect and modify the runtime behavior of applications. Reflection is one of the advance topic of core java. Using reflection we can inspect a class,interface_reports all fields methods 哦日期classes,found in the specified

HomeAssistant实现对UPS的数据监控_network ups tools-程序员宅基地

文章浏览阅读4.4k次。之前写在《米家接入HomeKit系列》系列文章的时候,我们讲解了如何使用通过HomeAssistant和HomeBridge来将米家设备接入HomeKit中。细心的同学应该发现我在讲解米家接入HomeKit系列二:通过群辉NAS的Docker搭建HomeAssistant章节最后的配置截图中有个UPS的配置。于是就有玩NAS的小伙伴问我UPS如何接入HomeAssistant。那么今天我就特意写一篇文章给大家介绍下我们怎样才能够将UPS接入到HomeAssistant中进行展示监控。_network ups tools

android 字符串折线图,Android + MPAndroidChart 实现折线、柱形和饼状图-程序员宅基地

文章浏览阅读275次。本文讲讲怎么用 MPAndroidChart 框架实现折线图、柱形图、饼图,并且进行样式设置,达到和宣传图差不多的效果。一开始看到 MPAndroidChart 的各种图表介绍图感觉很好看,但是直接New一个相应图表,仅仅填充数据的话,样式稍微有些丑。经过一番阅览文档才把样式调整得好看些。所以就写了这篇文章作下记录。APP 里实现的最终效果:最终效果引入框架首先是引入框架:Gradle配置一下依赖...

react获取noe4j 数据 用d3js展示_react neo4j-程序员宅基地

文章浏览阅读564次。import neo4j from 'neo4j-driver' async getKnowMap(cypher, user) { // console.log(cypher); // neo4j数据展示 var config = { container_id: "viz", server_url: "bolt://192.168.51.109:7687", server_use_react neo4j