Java中幾種常見的NPE問題
阿新 • • 發佈:2018-09-16
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 voidsetName(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 = newHashMap<>(); 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問題