为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Optional 继续说我的 List 为空?

为什么 Optional 继续说我的 List 为空?

森林海 2022-07-06 17:15:08
我正在尝试创建一个管理订票系统的 Java 程序。我有一个电影课:    public class Film {  private String title;  private Double price;  private String ageRestriction;  private double rating;  private String genre;  private String location;  private String screenDay;基于两个参数(位置和周)创建电影项的 ArrayList 并排序的 FilmList 类    public class FilmList {    public FilmList(ArrayList<Film> filmArrayList) {    this.filmArrayList = filmArrayList;  }  public FilmList (){    this.filmArrayList = new ArrayList<>();  }  public ArrayList <Film> filmArrayList;  public void addFilm(Film films){    this.filmArrayList.add(films);  }  private String showLocation;  private String screenWeek;  public void setScreenWeek(String screenDay) {    this.screenWeek = screenDay;  }  public String getScreenWeek() {    return screenWeek;  }  public void setShowLocation(String location) {    this.showLocation = showLocation;  }  public String getShowLocation() {    return showLocation;  }  public Optional<Film> searchFilm(){    Optional<Film> movieFounded = filmArrayList.stream().filter(i -> i.getLocation().contains(getShowLocation()) &&            i.getScreenDay().contains(getScreenWeek())).findAny();    return movieFounded;  }setShowLocation 参数是通过单击按钮来设置的(每个剧院都有一个,而 setScreenWeek 是由 Combobox 设置的图形单元与控制台的接口。请注意,如果我按下按钮而不选择组合框上的任何内容,则会出现错误。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

所以


FilmList filmList = new FilmList();

filmList.addFilm

System.out.println(searchFilm().toString());

您的代码有点奇怪,但我想您的意思是将Film实例传递给addFilm,然后使用filmList.searchFilm().


反正


filter(

    i -> i.getLocation().contains(getShowLocation()) &&

         i.getScreenDay().contains(getScreenWeek())

)

在这里,您正在过滤filmArrayList,此时它包含一个元素。和


i.getLocation().contains(getShowLocation())

基本上意味着


i.getLocation().contains(null)

因为该showLocation字段未初始化。

这同样适用于第二个条件,使用screenWeek.


我实际上很惊讶它没有抛出 a NullPointerException,因为


public boolean contains(CharSequence s) {

    return indexOf(s.toString()) > -1;  // NullPointerException at s.toString()

}

但是无论如何,假设您初始化了这些字段,然后唯一的元素被filter操作丢弃,这就是您看到Optional.empty.


final FilmList filmList = new FilmList();

filmList.setShowLocation("Your location");

filmList.setScreenWeek("Screen week");

filmList.addFilm(filmInstance);


System.out.println(filmList.searchFilm().toString());

您显然需要一个完全构造的Film实例


final Film filmInstance = new Film(); 

filmInstance.title = "The NullPointerException adventure";

filmInstance.price = 12D;

filmInstance.ageRestriction = "+18";

filmInstance.rating = 18D;

filmInstance.genre = "Horror";

filmInstance.location = "US";

filmInstance.screenDay = "Monday";


filmList.addFilm(filmInstance);

问题出在FilmList#setShowLocation方法上。

您正在分配showLocation给自己,并且该location参数未使用。


public void setShowLocation(String location) {

    this.showLocation = showLocation;

}

这应该是


public void setShowLocation(String location) {

    this.showLocation = location;

}


查看完整回答
反对 回复 2022-07-06
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号