Получение индекса списка за пределами ошибки даже после нулевой проверки. ниже пример работоспособного кода.

Демонстрационный код Apex

   String order = 'asc';
   String usrId = '<userid>';
   String query = 'SELECT Id, Name FROM Opportunity WHERE OwnerId =: usrId Order By Name '+order;
   List<Opportunity> oppManOwner = database.query(query );
   List<Opportunity> oppFiltered = new List<Opportunity>();

   Integer maxRecNo = 15;
   Integer pageNumber =3;

   Integer indexStart = (pageNumber*maxRecNo) - (maxRecNo);

   for(integer i=0; i< maxRecNo; i++){
      if(oppManOwner[indexStart] != null){ // List index getting out of bounds 
        oppFiltered.add(oppManOwner[indexStart++]);
      }
      else
        break;
    }

На странице номер 3 осталось менее 15 записей. Поэтому, когда дело доходит до этого момента, я предполагаю
oppManOwner[indexStart] != null разорвет цикл, но все равно выдаст ошибку "Индекс списка за пределами границ". Что здесь происходит не так?

0
Brav 8 Мар 2020 в 15:40

2 ответа

Лучший ответ

В списке вы можете получить доступ только к индексам от 0 до List.size()-1 включительно. Попытки выйти за пределы этого ограничения приводят к этому исключению. Более подходящей проверкой будет:

  if(oppManOwner.size() > indexStart) {

Еще лучше было бы просто ограничить цикл этими элементами для начала:

for(Integer i = (pageNumber-1)*maxRecNo, s = Math.min(pageNumber*maxRecNo, oppManOwner.size()); i < s; i++) {
  oppFiltered.add(oppManOwner[i]);
}
3
sfdcfox 8 Мар 2020 в 15:54
Спасибо. Я должен был знать, что исключение будет выброшено при выходе.
 – 
Brav
8 Мар 2020 в 17:44

В вашем списке может не быть записи, доступной в этом индексе. Вам нужно убедиться, что вы получаете из списка только в том случае, если по этому индексу есть доступный элемент. Поставьте галочку, чтобы проверить, есть ли в списке записи по указанному индексу. что-то вроде должно помочь -

if(oppManOwner.size() > indexStart) { 
     if(oppManOwner[indexStart] != null){ 
        oppFiltered.add(oppManOwner[indexStart++]);
      }
      else
        break;
}
0
Samir 8 Мар 2020 в 15:56
1
Этот код также столкнется с той же ошибкой. Доступ к List[list.size()] недействителен, поскольку последним элементом является list.size()-1. В этом случае это должно быть > вместо >=.
 – 
sfdcfox
8 Мар 2020 в 15:55
Спасибо. Я обновил ответ. Проверка всегда должна быть >, а не >=. Это должно избежать проблемы
 – 
Samir
8 Мар 2020 в 15:57