Попробуйте:
$user = Users::find(5); //get the inital user
$picFor = $user->pic_for; //get its pointer
$pictures = []; //initialize the result array
while (!is_null($user) && !is_null($picFor)) { //if I have a valid user and pointer
$user = Users::find($picFor); //get the user for the pointer
if ($user !== null) { //if I have a valid user
$picFor = $user->pic_for; //get the next pointer
$pictures[]= $user->id; //add the user id to the result array
}
}
Основная проблема, с которой вы столкнулись, заключается в том, что вы пропускаете некоторые нулевые проверки.
К сожалению, я все еще не точно ясен на причине, но на основе моего опыта, это кажется от явных бросков, как:
((Comparable) obj).compareTo(other)
Сгенерированный JavaScript похож:
dynamicCast(obj, 1).compareTo(other);
Где 1 сгенерированный идентификатор типа, представляющий цель броска. dynamicCast в свою очередь называет canCastUnsafe и если ложь, он бросает ClassCastException. Значение этого было обсуждено, так как это будет уже поймано в размещенном режиме.
Это может обойтись с JSNI:
public static native int compare(Object a, Object b) /*-{
return a.@java.lang.Comparable::compareTo(Ljava/lang/Object;)(b);
}-*/;
Не знайте, видели ли Вы этот поток на форуме Участника GWT...
В основном это запускается с той же проблемы, которую Вы определили, предлагает некоторые новые флаги компилятора и продолжает показывать, как использовать некоторый JSNI для обхождения бросков.
Редактирование В соединительной линии GWT там является новым флагом компилятора. Посмотрите Wiki...
Использование дженериков java 1.5 и подстановочных знаков могло избежать этого?