• Java中几种常见的NPE问题


    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);有参数这个方法,代码如下:

  • 相关阅读:
    window.location 对象所包含的属性
    控制器如何获取一条url中存在多个Id
    js 生成GUID
    JS控制前端控件的显示与隐藏
    ASP.NET CORE根据后台数值在razor页面进行判断单选按钮选中
    Selectize 控件使用以及js执行文件的时间差问题
    理解css中的position属性
    本地预览的vue项目,在githubpage静态展示
    关于img底部空白
    [优化]Steamroller-freecodecamp算法题目
  • 原文地址:https://www.cnblogs.com/shamo89/p/9656640.html
Copyright © 2020-2023  润新知