簡體   English   中英

java.lang.IllegalArgumentException: fromIndex(x) > toIndex(y)

[英]java.lang.IllegalArgumentException: fromIndex(x) > toIndex(y)

我將列表轉換為頁面以顯示帶有分頁的候選人表,但我收到錯誤 java.lang.IllegalArgumentException: fromIndex(5) > toIndex(1),請問如何解決這個問題?


 public Page<CandidatesDetailsDto> filterCandidates(Integer page, Integer pageSize) {

        page = (page == null || page < 1) ? 0 : page - 1;
        pageSize = (pageSize == null || pageSize < 1) ? 10 : pageSize;

        PageRequest pageRequest = new PageRequest(page, pageSize);

           List<CandidatesEntity> candidatesEntityList2 = candidatesService.findAll(pageRequest);

            int start = (int) pageRequest.getOffset();
            int end = (start + pageRequest.getPageSize()) > candidatesEntityList2.size() ? candidatesEntityList2.size() : (start + pageRequest.getPageSize());

            candidatesEntity = new PageImpl<CandidatesEntity>(candidatesEntityList2.subList(start, end), pageRequest, candidatesEntityList2.size());
        }

        return candidatesEntity.map(source -> candidatesDetailsConverter.convertTo(source));
    } 



發生此異常是因為在計算切片的開始時,您沒有考慮完整的候選列表中有多少對象。

如果我從您的方法中請求大小為 5 的第 1 頁,但您只有 2 個候選人,請看看會發生什么:

int page = 1;
int pageOffset = 5; // page * pageSize
List<Candidate> all = Arrays.asList(customer1);

int start = 5; // = pageOffset
int end = 1;   // Math.min(start, all.size()); because min(5, 1) == 1.

Page<Candidates> page = new PageImpl(all.subList(start, end)); // this is what throws

當有人向您請求不存在的頁面時,您必須特別考慮這種情況。 在這種情況下,您必須返回一個空頁面或null或其他內容,但重要的是它必須在不同的代碼路徑上處理。

所以,這里有一些幾乎可以工作的代碼:你必須自己實現nonExistentPage方法。

public Page<CandidatesDetailsDto> filterCandidates(Integer page, Integer pageSize) {

    page = (page == null || page < 1) ? 0 : page - 1;
    pageSize = (pageSize == null || pageSize < 1) ? 10 : pageSize;

    PageRequest pageRequest = new PageRequest(page, pageSize);

    List<CandidatesEntity> candidatesEntityList2 = candidatesService.findAll(pageRequest);

    int start = (int) pageRequest.getOffset();

    if (start <= candidatesEntityList2.size()) {
      return nonExistentPage(candidatesEntityList2.size()); // important part here
    }
    int end = Math.min(start + pageRequest.getPageSize(), candidatesEntityList2.size());

    candidatesEntity = new PageImpl<CandidatesEntity>(candidatesEntityList2.subList(start, end), pageRequest, candidatesEntityList2.size());

    return candidatesEntity.map(source -> candidatesDetailsConverter.convertTo(source));
}

/*
 * Implement this yourself: you must convey to the user that the page 
 * he requested from you does not exist.
 */
private abstract Page<CandidatesDetailsDto> nonExistentPage(int fullListSize);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM