求大佬看一下,我是照着老师的代码写的,怎么抛异常了?我该怎么改?

来源:5-3 学生选课---删除 Map 中的学生

qq_OK_21

2018-01-10 19:45

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)


写回答 关注

2回答

  • Sugn
    2018-01-10 20:21:02
    已采纳

    如果我猜得没错的话,是System.out.println("成功删除学生:" + students.get(id).name);这句话错了,已经被你删了,结果你又get他的name不是获取不到东西?


    qq_OK_... 回复Sugn

    " + students.get(id).name); command掉就不报错了,感谢!

    2018-01-11 19:48:01

    共 2 条回复 >

  • 慕哥5034676
    2018-01-19 15:09:51

    ("成功删除学生:" + students.get(id).name);会报空指针异常!!!之前已经remove了的!!

       这样就可以了:

      Student stu=students.get(id);

       students.remove(id);

       System.out.println("成功删除学生:"+stu.name);  


Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409768 学习 · 4463 问题

查看课程

相似问题