几种常见NPE

NPE(Null Point Exception的简称

1、Map下的NPE

      直接上代码:

 

[java] view plain copy
 
  1. public class User {  
  2.   
  3.     private Integer id;  
  4.   
  5.     private String name;  
  6.   
  7.     public Integer getId() {  
  8.         return id;  
  9.     }  
  10.   
  11.     public void setId(Integer id) {  
  12.         this.id = id;  
  13.     }  
  14.   
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.   
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.   
  23.     @Override  
  24.     public String toString() {  
  25.         return "User [id=" + id + ", name=" + name + "]";  
  26.     }  
  27. }  

 

 

[java] view plain copy
 
  1. public static void main(String[] args) {  
  2.     User user = new User();  
  3.       
  4.     Map<Integer, Object> hashMap = new HashMap<>();  
  5.     hashMap.put(user.getId(), user.getName());  
  6.       
  7.     Map<Integer, Object> concurrentHashMap = new ConcurrentHashMap<>();  
  8.     concurrentHashMap.put(user.getId(), user.getName());//这里出现NullPointerException  
  9. }  

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

2、foreach遍历集合删除元素

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

      情况2:

 

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

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

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

 

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

4、toArray()集合转换数组

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

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

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

 

 

参考链接:https://blog.csdn.net/lsq_java_4/article/details/72824625
posted on 2018-06-22 18:02  @ 小浩  阅读(677)  评论(0编辑  收藏  举报