java npe是什么_Java中几种常见的NPE问题

本文详细探讨了Java中Map存储null值的问题,解释了为何在ConcurrentHashMap中会出现NullPointerException。此外,还介绍了在遍历集合时删除元素的正确做法,强调使用Iterator避免并发操作引发的错误。同时,提醒开发者注意Arrays.asList()转换数组为集合时的限制,以及使用toArray()方法时避免ClassCastException的方法。最后,讨论了集合转换为数组时的注意事项和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Map下的NPE

直接上代码:

public classUser {privateInteger id;privateString name;publicInteger getId() {returnid;

}public voidsetId(Integer id) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

@OverridepublicString toString() {return "User [id=" + id + ", name=" + name + "]";

}

}

public static voidmain(String[] args) {

User user= newUser();

Map hashMap = new HashMap<>();

hashMap.put(user.getId(), user.getName());

Map concurrentHashMap = new ConcurrentHashMap<>();

concurrentHashMap.put(user.getId(), user.getName());//这里出现NullPointerException

}

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

3d429da3be6d45240cb77a05d0eb0078.png

2、foreach遍历集合删除元素

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

e860df3784ce06b1af2a5c485f0c9625.png

情况2:

public static voidmain(String[] args) {

List list = new ArrayList<>();

list.add("1");

list.add("2");

list.add("3");for(String str : list){if("2".equals(str)){

list.remove(str);

}

}

Iterator 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 voidmain(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);

}

}

045abe54ec758790be6ad6db6ea0f0a0.png      

注意:Arrays.asList()把数组转换成集合时,不能使用其修改集合的相关方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。asList()的返回对象是一个Arrays内部类,并没有实现集合的修改方法。所以,如果需要修改集合,要在转换之前操作。还需要注意一点,在你转换后,再对数组的值进行修改,集合也会跟着变化。

4、toArray()集合转换数组

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

9da28d1e693332a7dde2cfa2d64018ff.png

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

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

22350f4951684f77ceda52933e3e229a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值