Ok, that's cool.  But don't you think it's weird that the return value
isn't real.  I mean, might someone not change the 'throw' to another
statement and get unexpected results?

I stand by my 'implementations' purity.. even if its not readily
compilable.

On Aug 26, 6:36 pm, Reinier Zwitserloot <[email protected]> wrote:
> WTF? I already posted a much better version of this in the
> supermegauber thread. no need for class file hacking. sun.misc.Unsafe
> is an even worse idea (Security Manager issues, as well as a
> dependency on running in sun VMs).
>
> public class SneakyThrow {
>         public static RuntimeException sneakyThrow(Throwable t) {
>                 if ( t == null ) throw new NullPointerException("t");
>                 SneakyThrow.<RuntimeException>sneakyThrow0(t);
>                 return null;
>         }
>
>         @SuppressWarnings("unchecked")
>         private static <T extends Throwable> void sneakyThrow0(Throwable t)
> throws T {
>                 throw (T)t;
>         }
>
> }
>
> Note also how this is much more thought through: Java does not know
> that calling this method automatically triggers a throw statement, so
> the compiler will whine that you need to return something, and the DA
> rules are all messed up. Therefore, the suggested usage is:
>
> public int myMethod() {
>     throw sneakyThrow(new IOException());
>
> }
>
> Note the 'throw' in front of 'sneakyThrow'. If you've read up on your
> JLS and JVMS, you'll know that this code is perfectly valid java (and,
> given sun's dogged adherence to backwards compatibility, should mean
> it'll continue to work just fine), and that it'll work on every java-
> compatible VM.
>
> On Aug 26, 5:54 am, Christian Catchpole <[email protected]>
> wrote:
>
>
>
> > Yeah, i was reading about that one.  But it's only in the Sun VMs and
> > probably subject to change.
>
> > But hey, I just listed this as an exercise.  It just shows the
> > difference between checked and unchecked is one little byte. :)
>
> > On Aug 26, 1:44 pm, Marcelo Fukushima <[email protected]> wrote:
>
> > > theres also a throwException(Throwable) in sun.misc.Unsafe - though to
> > > use that you really have to want to
>
> > > On Wed, Aug 26, 2009 at 12:30 AM, Christian
>
> > > Catchpole<[email protected]> wrote:
>
> > > > Compile this..  (any package you like, or no package at all)
>
> > > > public class Rethrow {
> > > >    public static void unchecked(Throwable t) {
> > > >        t=t;
> > > >    }
> > > > }
>
> > > > javap reports the byte code as..
>
> > > > public static void unchecked(java.lang.Throwable);
> > > >  Code:
> > > >   Stack=1, Locals=1, Args_size=1
> > > >   0:   aload_0
> > > >   1:   astore_0
> > > >   2:   return
>
> > > > which in hex is:
>
> > > > 2A 4B B1
>
> > > > open the class file in the hex editor, search for that and change it
> > > > to:
>
> > > > 2A BF B1
>
> > > > javap now reports the byte code as..
>
> > > > public static void unchecked(java.lang.Throwable);
> > > >  Code:
> > > >   Stack=1, Locals=1, Args_size=1
> > > >   0:   aload_0
> > > >   1:   athrow
> > > >   2:   return
>
> > > > jar that class up or otherwise protect it from re-write.
>
> > > > In your code you can now call this without wrapping with a runtime
> > > > exception.  And the stack trace is still that of the original
> > > > exception.
>
> > > > } catch(Exception e) {
> > > >  Rethrow.unchecked(e);
> > > > }
>
> > > > Obviously, use at your own risk.  No warrenties etc. :)
>
> > > --http://mapsdev.blogspot.com/
> > > Marcelo Takeshi Fukushima
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "The 
Java Posse" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/javaposse?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to