投掷类<?扩展Throwable>

时间:2019-11-20 16:35:38

标签: java throwable

所以我有一个看起来像这样的函数:

    public void addExceptionCommands(Class<? extends Throwable> exClass, Command... commands) {
        for (Command command : commands) {

            try {
                //Push the command to the stack of executed commands
                executedCommands.push(command);
                command.execute();

            } catch (CouldNotExecuteCommandException e) {
                // Default strategy is to rollback
                rollback();
                // Log
                e.printStackTrace();
                //I want to throw exClass here
            }
        }
    }

我想抛出exClass,如何实现? 抛出exClass不起作用

编辑: 谢谢大家的所有回答,我最终使用了Supplier:D

4 个答案:

答案 0 :(得分:1)

拥有类类型时,您可以执行

之类的操作
throw exClass.newInstance(); 

答案 1 :(得分:1)

您只能抛出ThrowableClass isnt的子类。

但是,您可以修改方法以接受生成新Throwable的供应商,然后可以抛出该Throwable:


    public <T extends Throwable> void addExceptionCommands(Supplier<T> exceptionSupplier, Command... commands) throws T {
        for (Command command : commands) {
            try {
                //Push the command to the stack of executed commands
                executedCommands.push(command);
                command.execute();
            } catch (CouldNotExecuteCommandException e) {
                // Default strategy is to rollback
                rollback();
                // Log
                e.printStackTrace();
                //I want to throw exClass here

                final T exception = exceptionSupplier.get();
                exception.addSuppressed(e);

                throw exception;
            }
        }
    }

然后可以像这样调用方法:

addExceptionCommands(YourException::new, command1, command2, ...);

答案 2 :(得分:1)

参数是异常的类型。如果您扔东西,它必须是异常的 instance

我认为这不会像您想的那样起作用。

如果您希望调用者定义抛出的异常的类型,请然后让调用者在其自己的代码中定义。调用者可以捕获您的抛出的异常。方法,并将其包装在它选择的任何异常中。

public void addExceptionCommands( Command... commands) 
throws CouldNotExecuteCommandException {
  ...
}

...
   try {
       commandable.addExceptionCommands( myCommands );
   } catch (CouldNotExecuteCommandException e) {
      // Wrap the command exception in my own.
      throw new MySpecialException( "My message", e );
   }

如果要支持命令中的各种例外情况,请考虑Java的 java.util.concurrent 包提供的示例。考虑ExecutorService.submit()方法和Future.get()方法。提交给执行者的任务会引发各种各样的异常。但是Future.get()会将抛出的所有异常包装在一个定义明确并声明为ExecutableException的位置。

答案 3 :(得分:1)

尝试使用java.lang.reflect.Constructor

Constructor.newInstance()Class.newInstance()更好,因为它允许您使用参数来创建新实例。

Constructor constructor = exClass.getDeclaredConstructor();
Throwable ex = (Throwable) constructor.newInstance(); 
throw ex;

带有String参数(用于消息?)

Constructor constructor = exClass.getDeclaredConstructor(String.class);
Throwable ex = (Throwable) constructor.newInstance("message goes here"); 
throw ex;

https://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

此外,Class.newInstance()已被弃用。 https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#newInstance--