<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">See comments in two places below.<div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Mar 23, 2018, at 2:45 PM, Brian Goetz <<a href="mailto:brian.goetz@oracle.com" class="">brian.goetz@oracle.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Just want to sync and make sure we're on the same page here...<br class=""><br class="">Certain constructs (switch expression, switch statement, for/while/do) give meaning to some flavor of break.  Inside those, you can't use the other flavor, nor can you break "through" a construct of the opposite flavor.<br class=""><br class="">    switch-expression {<br class="">        break / break-label not allowed;<br class="">        break-expr allowed;<br class="">        continue, return not allowed;<br class=""><br class="">        if (foo) {<br class="">            break / break-label disallowed;<br class="">            break-expr allowed;<br class="">        }<br class=""><br class="">        LOOP:<br class="">        for (...) {<br class="">            break, continue allowed;<br class="">            return not allowed;<br class="">            break-label allowed if within the switch expression<br class="">            break expression not allowed;<br class="">        }<br class=""><br class="">        switch (e) {<br class="">            // same as for loop<br class=""></div></div></blockquote><div><br class=""></div>Actually, same as for loop _except_ continue not allowed.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div class="">            switch-expression {<br class="">                break expr allowed<br class="">                break, break-label, continue, return not allowed<br class="">        }<br class="">    }<br class=""><br class="">More formally; we can construct a table whose rows are the control constructs and whose columns are the nonlocal branches, and whose entries are "handlers" for a nonlocal branch.  Each block has a parent (the immediately enclosing block.)<br class=""><br class="">            break-e   break   break-l   continue   return<br class=""><br class="">switch-e      L         X       X         X          X<br class="">switch-s      X         L       P         L          P<br class="">for           X         L       P         L          P<br class="">while         X         L       P         L          P<br class="">block         P         P       P         P          P<br class="">labeled       X         X L*        X          P<br class="">lambda        X         X       X         X L<br class="">method        X         X X         X          L<br class=""><br class="">The handlers mean:<br class=""><br class="">X -- not allowed<br class="">P -- let the parent handle it<br class="">L -- handle it and complete normally<br class="">L* -- handle it and complete normally if the labels match, otherwise P<br class=""><br class="">(I might have mangled the labeled row, in which case surely Guy will correct me.)</div></div></blockquote><div><br class=""></div>Right.  It should be:</div><div><br class=""></div><div><span style="font-family: Monaco;" class="">labeled       P         P         L*        P          P</span></div><div><br class=""></div><div>“In all other cases of abrupt completion of the Statement, the labeled statement completes abruptly for the same reason.”  JLS SE8 14.7, page 413</div><div><br class=""></div><div>All the other rows look good to me.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div class="">The idea here is that each nested block acts as an "exception handler", catching some exceptions, and propagating others, and some contexts act as exception barriers, like trying to throw a "continue" out of a method.<br class=""></div></div></blockquote></div><br class=""><div class="">—Guy</div><div class=""><br class=""></div></div></body></html>