Следният код трябва да постигне желаното, ако обработката на изключенията работи според очакванията:
XVector position = new XVector();
IntStream.range(0, desired_star_count).forEach(a -> {
// Try to find a position outside the margin of other stars.
try
{
IntStream.range(0, XStarField.patience).forEach(b -> {
position.random(size);
error:
{
for (XVector point : this.positions)
if (position.sub(point).get_magnitude() < min_star_margin)
break error;
throw new XStarField.Found();
}
});
}
catch (XStarField.Found event)
{
this.positions.add(position.copy());
this.colors.add(Math.random() < 0.5 ? XColor.RED : XColor.BLUE);
}
});
За съжаление се генерират следните две грешки:
Error:(33, 25) java: unreported exception XStarField.Found; must be caught or declared to be thrown
Error:(37, 13) java: exception XStarField.Found is never thrown in body of corresponding try statement
Ако трябваше да напиша същия код на Python, вероятно щеше да се получи така:
position = XVector()
for a in range(desired_star_count):
for b in range(self.patience):
position.random(size)
for point in self.positions:
if abs(position - point) < min_star_margin:
break
else:
self.position.append(position.copy())
self.colors.append(XColor.RED if random.random() < 0.5 else XColor.BLUE)
break
Това би било лесно да се напише, без да се използват потоци, но смятам, че това е академично упражнение за обучение, за да ги разберем по-добре. Има ли начин да напишете кода, за да замените циклите за броене и да използвате потоци на тяхно място, както беше направен опит?
error
? - person Michael   schedule 03.06.2016break error;
се изпълни, това означава, че текущата стойност наposition
не може да се използва, защото е в рамките на минималния марж на някоя друга звезда. Акоbreak error;
не се изпълни, тогаваthrow new XStarField.Found();
трябва да бъде изпълнено и уловено от манипулатора на събитие (изключение). В този момент е известно, че стойността наposition
е приемлива. - person Noctis Skytower   schedule 03.06.2016filter
от тези, които не отговарят на изискванията за марж -›findFirst
. - person user2357112 supports Monica   schedule 03.06.2016XStarField.Found
да наследява отRuntimeException
вместоException
. Вие сте прав, че моето използване на изключение като събитие е доста необичайна парадигма, но изкривяването на мислите ми доведе до полезно, работещо решение. - person Noctis Skytower   schedule 03.06.2016