Java中几种常见的NPE问题

Posted 那啥快看

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);有参数这个方法,代码如下:

技术分享图片


以上是关于Java中几种常见的NPE问题的主要内容,如果未能解决你的问题,请参考以下文章

java返回参数中几种常见的方法

Java中几种常用的设置小数点后位数的方法

Java 中几种常用设计模式

详解密码学中几种常见密码加密与解密

MCU中几种常见的打印输出的方法

RestTemplate中几种常见的请求方式