Switch expressions spec

Alex Buckley alex.buckley at oracle.com
Fri Mar 15 18:39:49 UTC 2019


// The mail below doesn't appear to have made it to the 
amber-spec-experts web archive, even though Manoj is a member of the list.

Hey Gavin,

In a switch expression, I believe it should be legal for every 
`case`/`default` arm to complete abruptly _for a reason other than a 
break with value_.

That is, a legal switch expression may have zero rules like `case a -> 
5;` (completes normally) or `case b -> { break 6; }` (completes abruptly 
for reason of break with value). Instead, it only has rules like `case c 
-> { throw new Exc(); }` or `case d -> throw new Exc();`, both of which 
complete abruptly for reason othan than break with value. (Extend to 
switch labeled statement groups.)

I suspect that the strong rule flagged by Manoj:

     It is a compile-time error if a switch expression has no result 
expressions.

is trying to require a value `break` statement being present in every 
switch labeled block, because a rule earlier in 15.28.1 did not quite go 
that far:

     If the switch block consists of switch labeled rules, then any 
switch labeled block (14.11.1) must complete abruptly.

Alex

On 3/14/2019 4:14 PM, Manoj Palat wrote:
> Hi Alex, Gavin,
>
> One more clarification of the spec:
>
> Consider the following code:
> public class X {
> @SuppressWarnings("preview")
> public static int foo(int i) throws MyException {
> int v = switch (i) {
> default -> throw new MyException(); // error or no error?
> };
> return v;
> }
> public static void main(String argv[]) {
> try {
> System.out.println(X.foo(1));
> } catch (MyException e) {
> System.out.println("Exception thrown as expected");
> }
> }
> }
> class MyException extends Exception {
> private static final long serialVersionUID = 3461899582505930473L;
> }
>
> As per spec, JLS 15.28.1
>
> It is a compile-time error if a switch expression has no result expressions.
>
> ------------------------
>
> Throw statement is not a result expression and hence as per the spec we
> should be giving this error.
>
> Is this an omission in the spec? Should we be flagging an error?
>
> In Eclipse ECJ we are flagging an error but I observed javac does not -
> Want to get clarity on what does the spec mean.
>
> Regards,
>
> Manoj
>
> Eclipse Java Dev,
>
> IBM.


More information about the amber-spec-experts mailing list