Лучшим способом (рекомендуется) является использование пакета java.util.Concurrent. Используя этот пакет, вы можете легко избежать этого исключения. см. Модифицированный код
blockquote>public static void main(String[] args) { Collection<Integer> l = new CopyOnWriteArrayList<Integer>(); for (int i=0; i < 10; ++i) { l.add(new Integer(4)); l.add(new Integer(5)); l.add(new Integer(6)); } for (Integer i : l) { if (i.intValue() == 5) { l.remove(i); } } System.out.println(l); }
Если RHS правила может вызвать исключение, то автор правила должен написать RHS таким образом, чтобы обработать исключение.
Это также связано с тем, что исключение может иметь место в любой точке тела RHS; остальные операторы RHS могут упустить шанс обновить рабочую память новым состоянием после операций, которые могли вызвать исключение, оставив рабочую память в несовместимом состоянии с точки зрения бизнеса / домена / знания, так как в следующем примере:
rule "Process order"
when
$o : Order()
then
processSomeOrder($o); // some exception might occur here
...
delete($o);
end
Без обработки исключений это может привести к многократной обработке заказа, всегда заканчивающемуся исключением снова и снова; в зависимости от точки зрения бизнеса / домена / знания, правило может быть пересмотрено следующим образом:
rule "Process order"
when
$o : Order()
then
try {
processSomeOrder($o); // some exception might occur here
} catch(Exception e) {
forwardOrderToHumanForManualProcessing($o, e);
}
...
delete($o);
end
В этом примере зависит от проекта домена / бизнеса, чтобы решить, как обрабатывать потенциальное исключение, возникающее во время стандартная обработка, а в случае исключения принимается еще одна бизнес-операция. В любом случае состояние WM управляется последовательно.