Java 投掷类<;?扩展可丢弃性>;

Java 投掷类<;?扩展可丢弃性>;,java,throwable,Java,Throwable,我有一个函数,看起来像这样: public void addExceptionCommands(Class当您有一个类类型时,您可以执行以下操作 throw exClass.newInstance(); 当您有一个类类型时,您可以执行以下操作 throw exClass.newInstance(); 您只能抛出Throwable和Classisnt的子类 但是,您可以修改您的方法以接受供应商,该供应商生成一个新的可丢弃项,然后您可以抛出: public void addExceptio

我有一个函数,看起来像这样:


public void addExceptionCommands(Class当您有一个类类型时,您可以执行以下操作

throw exClass.newInstance(); 

当您有一个类类型时,您可以执行以下操作

throw exClass.newInstance(); 

您只能抛出
Throwable
Class
isnt的子类

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


public void addException命令(供应商例外供应商,命令…命令)抛出{
用于(命令:命令){
试一试{
//将命令推送到已执行命令的堆栈中
push(命令);
command.execute();
}捕获(不能执行命令和异常e){
//默认策略是回滚
回滚();
//日志
e、 printStackTrace();
//我想在这里扔一块石头
final T exception=exceptionSupplier.get();
例外情况(e);
抛出异常;
}
}
}
然后,您可以这样调用您的方法:

addExceptionCommands(YourException::new、command1、command2等);

您只能抛出
Throwable
Class
isnt的子类

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


public void addException命令(供应商例外供应商,命令…命令)抛出{
用于(命令:命令){
试一试{
//将命令推送到已执行命令的堆栈中
push(命令);
command.execute();
}捕获(不能执行命令和异常e){
//默认策略是回滚
回滚();
//日志
e、 printStackTrace();
//我想在这里扔一块石头
final T exception=exceptionSupplier.get();
例外情况(e);
抛出异常;
}
}
}
然后,您可以这样调用您的方法:

addExceptionCommands(YourException::new、command1、command2等);
该参数是异常的一种类型。如果抛出某个对象,它必须是异常的实例

我认为这不会像你想的那样奏效

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

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并发包提供的示例。考虑<代码> ExtutoService。子()/<代码>方法和方法。提交给执行程序的任务可以抛出大量的异常。但是<代码>
将抛出的任何异常包装在一个单独的、定义良好且声明的
ExecutableException
中。该参数是异常的一种类型。如果抛出某个异常,它必须是异常的实例

我认为这不会像你想的那样奏效

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

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并发包提供的示例。考虑<代码> ExtutoService。子()/<代码>方法和方法。提交给执行程序的任务可以抛出大量的异常。但是<代码>将抛出的任何异常包装在一个单独的、定义良好且声明的
ExecutableException

尝试使用
java.lang.reflect.Constructor

Constructor.newInstance()
优于
Class.newInstance()
,因为它允许您使用参数创建新实例

Constructor constructor = exClass.getDeclaredConstructor();
Throwable ex = (Throwable) constructor.newInstance(); 
throw ex;
带有
字符串
参数(用于消息?)

另外,
Class.newInstance()
已被弃用。

尝试使用
java.lang.reflect.Constructor

Constructor.newInstance()
优于
Class.newInstance()
,因为它允许您使用参数创建新实例

Constructor constructor = exClass.getDeclaredConstructor();
Throwable ex = (Throwable) constructor.newInstance(); 
throw ex;
带有
字符串
参数(用于消息?)

另外,
Class.newInstance()
已被弃用。

您只传递一个类对象,它主要用于反射。您可能应该传递一个
Throwable
,这样它实际上可以被thrown该参数是一种异常类型。您必须抛出一个异常实例。如何
抛出Exportss.newInstance()
?我明白了,谢谢大家:我们只传递一个类对象,它主要用于反射。您可能应该传递一个
Throwable
,这样它实际上可以被thrown。参数是一种异常类型。您必须抛出一个异常的实例。如何
抛出惊叹号。newInstance()
?我明白了,谢谢大家:Ddeprecated。传入
供应商弃用会更安全。传入
供应商会更安全。在这里,我们与其说是抑制原始异常,不如说是以另一种形式传递它。调用
异常。initCause(e)
而不是
addsupprested()
。在这里,我们与其说是抑制原始异常,不如说是以另一种形式传递它。调用
exception.initCause(e)
比调用
addsuppress更有意义