On 09/10/2013 08:47, Dr Heinz M. Kabutz wrote:
I noticed the other day when using Java 8 that Thread.stop(Throwable)
was throwing an UOE. Unfortunately I missed the discussion in May
amongst the thousands of other important JDK emails. Thus I presume
that nothing I might have to say on the matter would change what is
currently in the OpenJDK ;-) But I'd like to state it "for the
record" anyway.
Throwing checked exceptions in an unchecked context is, IMHO,
something one should almost never do, except maybe in test cases. Up
to now, I've known of quite a few ways to do this though:
1. Thread.stop(Throwable) with some mangling - see ThrowerConcurrent
in http://www.javaspecialists.eu/archive/Issue144.html
2. Abusing generics
3. Class.newInstance(), described in Java Puzzlers
(http://www.javaspecialists.eu/archive/Issue144.html)
4. Unsafe.throwException() similar to ThrowerConcurrent in #1.
Since this is something that we should not do anyway, it is no harm to
remove one of the ways, this being Thread.stop(Throwable).
As I'm sure you can appreciate, it consumes a lot of oxygen to remove
something and I'm hoping we don't have to spend any more time on this
one. One comment on your list is that #1 differs in that it can cause
other threads to misbehave and this is one of the main motives for
finally pulling the plug on this method. For a sneakyThrow on the
current thread then there are other options (as your puzzlers
demonstrate) but hopefully there aren't too many cases where non-test
code needs to do this.
-Alan.