投掷 Class<?扩展可抛>

throwing Class<? extends 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

当你有 class 类型时,你可以做类似

的事情
throw exClass.newInstance(); 

您只能抛出 Throwable 的子类,而 Class 不是。

但是,您可以修改您的方法以接受生成新 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, ...);

参数是类型的异常。如果你抛出一些东西,它必须是异常的实例

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

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

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.

尝试使用 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--