paulmurray の回答の後、クロージャー内からスローされた例外で何が起こるか確信が持てなかったので、考えやすい JUnit テスト ケースを作成しました。
class TestCaseForThrowingExceptionFromInsideClosure {
@Test
void testEearlyReturnViaException() {
try {
[ 'a', 'b', 'c', 'd' ].each {
System.out.println(it)
if (it == 'c') {
throw new Exception("Found c")
}
}
}
catch (Exception exe) {
System.out.println(exe.message)
}
}
}
上記の出力は次のとおりです。
a
b
c
Found c
ただし、 「フロー制御に例外を使用しないでください」ということを覚えておいてください。特に、スタック オーバーフローの質問: Why not use exceptions as regular flow of control? を参照してください。
したがって、上記のソリューションは、いずれにしても理想的とは言えません。使用するだけです:
class TestCaseForThrowingExceptionFromInsideClosure {
@Test
void testEarlyReturnViaFind() {
def curSolution
[ 'a', 'b', 'c', 'd' ].find {
System.out.println(it)
curSolution = it
return (it == 'c') // if true is returned, find() stops
}
System.out.println("Found ${curSolution}")
}
}
上記の出力も次のとおりです。
a
b
c
Found c