Multi-catch and exhaustiveness check
Thiago Henrique Hupner
thihup at gmail.com
Mon Aug 1 14:48:55 UTC 2022
That makes sense.
Thank you.
Em seg., 1 de ago. de 2022 às 11:38, Brian Goetz <brian.goetz at oracle.com>
escreveu:
> First question: what is the type of `e` in your catch block?
>
> You might think it is the union type MyAbstractException |
> MyUncheckedException, but in fact it is the least upper bound (LUB) of the
> two, which turns out to be RuntimeException, as per JLS 14.20:
>
> The declared type of an exception parameter that denotes its type as a
> union with
> alternatives D1 | D2 | ... | Dn is lub(D1, D2, ..., Dn).
>
>
> So your switch is a switch on a variable of type RuntimeException, and the
> switch is obviously not exhaustive. So the compiler is correct.
>
> You might ask: why would we define the type of the catch formal like
> this? Well, you have to go back to the context in which multi-catch was
> added. This was the Project Coin days, where the scope was very limited --
> including no type system changes -- and the use of LUB in this way was a
> trade-off that made it mostly acceptable. The alternative would have been
> adding full-blown union types, which would not have been a small change
> (see this PhD thesis which outlines what would have been involved:
> https://scholarship.rice.edu/handle/1911/103594).
>
>
>
>
>
>
>
>
>
> On 8/1/2022 8:28 AM, Thiago Henrique Hupner wrote:
>
> Hello all!
>
> I've played around with the exhaustiveness check and I'd like to
> discuss whether the following code should compile or it is right not to
> compile.
>
> import java.util.*;
> import java.io.*;
>
> sealed abstract class MyAbstractException extends RuntimeException {
> final static class MyException extends MyAbstractException {}
> }
>
> final class MyUncheckedException extends UncheckedIOException {
> public MyUncheckedException() {
> super(null);
> }
> }
>
> public class SealedException {
> public static void main(String[] args) {
> try {
> throw new MyUncheckedException();
> } catch (MyAbstractException | MyUncheckedException e) {
> switch (e) {
> case MyAbstractException.MyException a -> {}
> case MyUncheckedException b -> {}
> }
> }
> }
> }
>
> As MyUncheckedExceptionh is final, and MyAbstractException.MyException is
> the only implementation available for MyAbstractException, I guess it is
> exhaustive, but the compiler disagrees.
>
> SealedException.java:23: error: the switch statement does not cover all
> possible input values
> switch (e) {
> ^
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20220801/db092e30/attachment.htm>
More information about the amber-dev
mailing list