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 -~----------~----~----~----~------~----~------~--~---