<div dir="ltr">It is throwing an NPE when he dereferences the null o — I thought the same thing the first time I looked at it.<div><br></div><div>Sam</div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Thu, Mar 6, 2014 at 9:15 PM, David Holmes <span dir="ltr"><<a href="mailto:david.holmes@oracle.com" target="_blank">david.holmes@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="">On 6/03/2014 9:29 PM, Remi Forax wrote:<br>
> A colleague of mine have find a hairy bug,<br>
> here is a simple code to reproduce it.<br>
><br>
> import java.io.IOException;<br>
><br>
> public class FunWithMultiCatch {<br>
>     public static void main(String[] args) {<br>
>       Runnable r = () -> {<br>
>         try {<br>
>           Object o = null;<br>
>           o.getClass();<br>
>           throw new IOException();<br>
>         } catch(IOException | IllegalArgumentException e) {<br>
>           System.out.println("KO !");<br>
>         } catch(RuntimeException e) {<br>
>           System.out.println("OK !");<br>
>         }<br>
>       };<br>
>       r.run();<br>
>     }<br>
> }<br>
><br>
> It prints 'KO !' :(<br>
<br>
</div>What am I missing? We throw IOException and have a catch block for<br>
IOException so I would expect it to print "KO !".<br>
<br>
I'm more surprised that a non-lambda version prints "OK !"<br>
<div class=""><br>
> The problem can be reproduced for any multi-catch inside a lambda,<br>
> the exception table is clearly wrong, the IOException and IAE are merged<br>
> to their common supertype (java.lang.Exception).<br>
<br>
</div>That would definitely seem wrong, but more of an issue with catching<br>
RuntimeExceptions in the first block that should be handled by the<br>
second catch block. eg change it to throw IllegalStateException() instead:<br>
<br>
if (false) throw new IOException();<br>
throw new IllegalStateException();<br>
<br>
-> "KO !"   !!!WT!<br>
<br>
David<br>
-----<br>
<div class="HOEnZb"><div class="h5"><br>
> private static void lambda$main$0();<br>
>       Code:<br>
>          0: aconst_null<br>
>          ...<br>
>         14: athrow<br>
>         15: astore_0<br>
>         16: getstatic     #8                  // Field<br>
> java/lang/System.out:Ljava/io/PrintStream;<br>
>         19: ldc           #9                  // String OK !<br>
>         21: invokevirtual #10                 // Method<br>
> java/io/PrintStream.println:(Ljava/lang/String;)V<br>
>         24: goto          36<br>
>         27: astore_0<br>
>         28: getstatic     #8                  // Field<br>
> java/lang/System.out:Ljava/io/PrintStream;<br>
>         31: ldc           #12                 // String KO !<br>
>         33: invokevirtual #10                 // Method<br>
> java/io/PrintStream.println:(Ljava/lang/String;)V<br>
>         36: return<br>
>       Exception table:<br>
>          from    to  target type<br>
>              0    15    15   Class<br>
> java/lang/Exception                            <------------ Oops<br>
>              0    15    27   Class java/lang/RuntimeException<br>
><br>
> The current workaround is to not use a multi-catch in a lambda.<br>
><br>
> It seems that some version of Eclipse had the same issue but it's fixed<br>
> with the one I use (from 21 feb).<br>
><br>
> cheers,<br>
> Rémi<br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div>