1. 程式人生 > >Java中幾種常見的NPE問題

Java中幾種常見的NPE問題

avi oar 返回 對象 [] 報錯 不能 alt public

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問題