亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號