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 <christ...@catchpole.net>
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 <takesh...@gmail.com> 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<christ...@catchpole.net> 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 javaposse@googlegroups.com
To unsubscribe from this group, send email to 
javaposse+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/javaposse?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to