JUnit测试出现Null Pointer Exception,却期望抛出MovieListException
解决JUnit测试中电影评分HashMap的空指针异常问题
嘿,我明白你现在的困惑——明明已经在Rating类里做了空值检查,结果还是碰到了NullPointerException对吧?问题出在你调用Rating方法的时机不对,咱们一步步拆解:
问题根源
当你用movieList.get(string)去拿对应电影的评分时,如果HashMap里没有这个key,它会直接返回null。这时候你直接去调用null.gXXX()(比如getRatingValue()),就会触发空指针异常——这时候根本没机会走到Rating类里的检查逻辑,因为你连Rating对象都没拿到啊!
解决方案:分两步做异常检查
咱们把异常检查拆成两个场景,分别在对应的类里处理:
1. 在MovieList类里先检查“电影是否存在”
在你获取Rating对象之后,先判断它是不是null,如果是,直接抛你的自定义MovieListException,不要急着调用方法:
public Integer getMovieRating(String movieName) throws MovieListException { Rating rating = movieList.get(movieName); // 先确认有没有拿到Rating对象 if (rating == null) { throw new MovieListException("找不到该电影的评分记录"); } // 到这里rating肯定不是null,放心调用它的方法 return rating.getRatingValue(); }
2. 在Rating类里检查“评分属性是否为空”
你之前写的Rating类的空值检查,应该用来处理电影存在但评分本身是空的情况(比如Rating的value字段没赋值),比如:
public class Rating { private Integer value; public Integer getRatingValue() throws MovieListException { if (value == null) { throw new MovieListException("该电影的评分为空值"); } return value; } }
这样一来,两种异常场景就清晰区分了:
- 电影在HashMap里找不到 → MovieList类抛异常
- 电影存在但评分属性为空 → Rating类抛异常
JUnit测试用例验证
你可以写两个测试用例分别验证这两种情况,确保逻辑正确:
测试场景1:电影不存在时抛出异常
@Test(expected = MovieListException.class) public void testMissingMovieThrowsException() throws MovieListException { MovieList movieList = new MovieList(); // 传入一个不存在的电影名称 movieList.getMovieRating("不存在的科幻片"); }
测试场景2:电影存在但评分为空时抛出异常
@Test(expected = MovieListException.class) public void testNullRatingValueThrowsException() throws MovieListException { MovieList movieList = new MovieList(); // 添加一个评分属性为空的电影 movieList.addMovie("某冷门电影", new Rating(null)); movieList.getMovieRating("某冷门电影"); }
总结一下:空指针的核心就是你在null对象上调用了方法,所以一定要先确保movieList.get()返回的对象不为null,再去执行后续操作。把不同场景的异常检查放在对应的类里,就能完美解决这个问题啦!
内容的提问来源于stack exchange,提问作者billy
相关产品推荐
相关产品推荐

