You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:56:54