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

我正在尝试创建一个管理订票系统的 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 设置的


图形单元与控制台的接口。请注意,如果我按下按钮而不选择组合框上的任何内容,则会出现错误。


森林海
浏览 156回答 1
1回答

函数式编程

所以FilmList filmList = new FilmList();filmList.addFilmSystem.out.println(searchFilm().toString());您的代码有点奇怪,但我想您的意思是将Film实例传递给addFilm,然后使用filmList.searchFilm().反正filter(&nbsp; &nbsp; i -> i.getLocation().contains(getShowLocation()) &&&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i.getScreenDay().contains(getScreenWeek()))在这里,您正在过滤filmArrayList,此时它包含一个元素。和i.getLocation().contains(getShowLocation())基本上意味着i.getLocation().contains(null)因为该showLocation字段未初始化。这同样适用于第二个条件,使用screenWeek.我实际上很惊讶它没有抛出 a NullPointerException,因为public boolean contains(CharSequence s) {&nbsp; &nbsp; return indexOf(s.toString()) > -1;&nbsp; // 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();&nbsp;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) {&nbsp; &nbsp; this.showLocation = showLocation;}这应该是public void setShowLocation(String location) {&nbsp; &nbsp; this.showLocation = location;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java