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);有參數這個方法,代碼如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM