Time to put a stop to Thread.stop? (original) (raw)

David Holmes david.holmes at oracle.com
Wed May 29 01:43:24 UTC 2013


On 29/05/2013 11:23 AM, Martin Buchholz wrote:

[+compiler-dev]

On Wed, May 15, 2013 at 1:05 AM, David Holmes <david.holmes at oracle.com>wrote: On 15/05/2013 3:16 PM, Martin Buchholz wrote:

General purpose library code sometimes would like to rethrow an exception that was previously caught. How should it do that? Umm catch it and throw it. If it is a checked-exception that you want to propogate then you should have declared it on your method, else you are going to wrap it in a runtime exception or error. There is no need for such sleaze. Taking a closer look at one use of Thread.stop, I see that we use it to throw a Throwable out of Callable.call. Which I think we should be able to do. But I can't.

Why do you think you should be able to throw an arbitrary Throwable from Callable.call?

cat CallableThrow.java && javac CallableThrow.java

public class CallableThrow { public static void main(String[] args) throws Throwable { final Throwable t = new Throwable(); new java.util.concurrent.Callable() { public Void call() throws Exception { throw t; }}; } } CallableThrow.java:5: error: unreported exception Throwable; must be caught or declared to be thrown public Void call() throws Exception { throw t; }}; ^ 1 error

If I change Exception to Throwable I get: public class CallableThrow { public static void main(String[] args) throws Throwable { final Throwable t = new Throwable(); new java.util.concurrent.Callable() { public Void call() throws Throwable { throw t; }}; } } CallableThrow.java:5: error: call() in <anonymous CallableThrow$1> cannot implement call() in Callable public Void call() throws Throwable { throw t; }}; ^ overridden method does not throw Throwable where V is a type-variable: V extends Object declared in interface Callable 1 error

All correct. You can't do this.

David



More information about the core-libs-dev mailing list