Android: ExternalSystemException: индекс строки вне диапазона: -130 для выпуска здания

Не очень хорошая политика принимать произвольные указатели в качестве входных параметров в публичном API. Лучше иметь типы «простых данных», например, целое число, строку или структуру (я имею в виду классическую структуру с простыми данными внутри, конечно, официально что-либо может быть структурой).

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

Но иногда у вас нет выбора - ваш API должен принять указатель.

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

Можете ли вы дважды проверить? Хорошо, что я сделал в таком случае, чтобы определить инвариант для типа, на который указывает указатель, и вызвать его, когда вы его получите (в режиме отладки). По крайней мере, если инвариант выходит из строя (или падает), вы знаете, что вам присвоено плохое значение.

// API that does not allow NULL
void PublicApiFunction1(Person* in_person)
{
  assert(in_person != NULL);
  assert(in_person->Invariant());

  // Actual code...
}

// API that allows NULL
void PublicApiFunction2(Person* in_person)
{
  assert(in_person == NULL || in_person->Invariant());

  // Actual code (must keep in mind that in_person may be NULL)
}
23
задан Karim Varela 15 September 2015 в 00:50
поделиться