求大佬看一下,我是照著老師的代碼寫的,怎么拋異常了?我該怎么改?
package?imoocCollection;
import?java.util.HashMap;
import?java.util.Map;
import?java.util.Map.Entry;
import?java.util.Scanner;
import?java.util.Set;
public?class?MapTest?{
//建一個map類型的屬性,用來承裝student對象的
public?Map<String,?Student>?students;
//在構造方法上給students初始化
public?MapTest()?{
this.students?=?new?HashMap<String,?Student>();
}
//測試添加方法:輸入學生的ID,判斷是否被占用
//若未被占用,提示輸入學生姓名,創建新的學生對象,并且添加到students中
//若被占用,打印輸出,該ID已被占用
public?void?testPut()?{
//創建一個Scanner對象
Scanner?sc?=?new?Scanner(System.in);
for(int?i=0;?i<3;?i++)?{
?System.out.println("請輸入學生ID:");
?String?id?=?sc.next();
?//判斷該ID是否被占用
?Student?s?=?students.get(id);
?if(s?==?null)?{
?//提示輸入學生姓名
?System.out.println("請輸入學生姓名:");
?String?name?=?sc.next();
?//創建新的學生對象
?Student?st?=?new?Student(id,?name);
?//通過調用students的put方法添加學生到hash?map里
?students.put(id,?st);
?System.out.println("成功添加學生:"?+?students.get(id).name);
?}
?else?{
?System.out.println("該學生ID已被占用");
?continue;
?}
}
}
//測試刪除Map中的映射
public?void?testRemove()?{
//獲取從鍵盤輸入的待刪除的學生ID
Scanner?sc?=?new?Scanner(System.in);
while(true)?{
//提示輸入待刪除的學生ID
System.out.println("請輸入要刪除的學生ID:");
String?id?=?sc.next();
System.out.println("接收到要刪除的學生ID:"?+?id);
//判斷id是否有對應的學生對象
System.out.println(students.get(id).name);
if(students.get(id)?!=?null)?{
System.out.println("進入到if條件句里!");
students.remove(id);
System.out.println("已經remove掉ID了");
}
else?{
System.out.println("該ID不存在!");
continue;
}
System.out.println("成功刪除學生:"?+?students.get(id).name);
break;
}
}
//通過entrySet方法來遍歷Map
public?void?testEntrySet()?{
//通過entrySet方法,返回Map中所有的鍵值對
Set<Entry<String,?Student>>?entrySet?=?students.entrySet();
for(Entry<String,?Student>?entry?:?entrySet)?{
System.out.println("取得鍵:"?+?entry.getKey());
System.out.println("對應的值為:"?+?entry.getValue().name);
}
}
//測試map的keySet()方法
public?void?testKeySet()?{
//通過keySet方法返回Map中所有鍵的Set集合
Set<String>?keySet?=?students.keySet();
//取得set的容量
System.out.println("總共有:"?+?keySet.size()?+?"個學生!");
//遍歷keySet,取得每一個鍵,在調用map的get方法取得每個鍵對應的value
for(String?s?:?keySet)?{
Student?st?=?students.get(s);
if(st?!=?null)?{
System.out.println("學生:"?+?st.name);
}
}
}
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
MapTest?mt?=?new?MapTest();
mt.testPut();
mt.testKeySet();
mt.testRemove();
mt.testEntrySet();
}
}請輸入學生ID:
1
請輸入學生姓名:
Tom
成功添加學生:Tom
請輸入學生ID:
2
請輸入學生姓名:
Jack
成功添加學生:Jack
請輸入學生ID:
3
請輸入學生姓名:
XiaoMing
成功添加學生:XiaoMing
總共有:3個學生!
學生:Tom
學生:Jack
學生:XiaoMing
請輸入要刪除的學生ID:
3
接收到要刪除的學生ID:3
Exception in thread "main" XiaoMing
進入到if條件句里!
已經remove掉ID了
java.lang.NullPointerException
at imoocCollection.MapTest.testRemove(MapTest.java:67)
at imoocCollection.MapTest.main(MapTest.java:105)
2018-01-10
如果我猜得沒錯的話,是System.out.println("成功刪除學生:"?+?students.get(id).name);這句話錯了,已經被你刪了,結果你又get他的name不是獲取不到東西?
2018-01-19
("成功刪除學生:"?+?students.get(id).name);會報空指針異常!??!之前已經remove了的??!
? ?這樣就可以了:
? Student stu=students.get(id);
? ?students.remove(id);
? ?System.out.println("成功刪除學生:"+stu.name); ?