Java 在allocateCapacity/deallocateCapacity期间引发InvalidCapacity和InvalidState异常

Java 在allocateCapacity/deallocateCapacity期间引发InvalidCapacity和InvalidState异常,java,device,redhawksdr,Java,Device,Redhawksdr,我在Redhawk前端接口的文档中看到,调用allocateCapacity()和deallocateCapacity()意味着在相应操作失败时引发某些异常。然而,Redhawk 1.9中当前的代码生成(从外观上看,在当前的开发中)表明,开发人员应该使用通过分配器对象对分配属性调用setAllocator()的范例。分配器接口如下所示: public interface Allocator<E> { public boolean allocate(E capacity);

我在Redhawk前端接口的文档中看到,调用allocateCapacity()和deallocateCapacity()意味着在相应操作失败时引发某些异常。然而,Redhawk 1.9中当前的代码生成(从外观上看,在当前的开发中)表明,开发人员应该使用通过分配器对象对分配属性调用setAllocator()的范例。分配器接口如下所示:

public interface Allocator<E> {
    public boolean allocate(E capacity);
    public void deallocate(E capacity);
}
公共接口分配器{
公共布尔分配(E容量);
公共无效解除分配(E容量);
}
这些方法不会抛出(选中的)异常类型InvalidCapacity和InvalidState。我本来希望能够在tuner allocation struct属性的allocate()和deallocate的实现过程中抛出这些函数,并让它们传播到allocateCapacity()deallocateCapacity()调用,但分配器接口上缺少@throws语句阻止了我这样做

我的问题是:

  • 我认为开发人员应该使用setAllocator()方法,对吗
  • 如果是这样,有没有办法在分配器实现中抛出这些已检查的异常,或者不鼓励我们在未生成的代码中抛出这些异常?
    2.a。如果不鼓励抛出这些,是否有任何标准的方法表明解除分配失败
  • 如果没有,我们应该如何实施分配?直接重写设备类中的allocateCapacity()和deallocateCapacity()似乎是一种糟糕的方法

  • 我正在RHEL 5上使用Redhawk 1.9.0进行开发。

    是的,通常分配器接口是实现分配的首选方法。在大多数情况下,设备基类将为您处理抛出InvalidState和InvalidCapacity异常。但是,它假定为通用设备,在前端规范中有几个地方,您打算抛出无法在基类级别检查的异常,例如分配ID是否有效。不幸的是,由于InvalidState和InvalidCapacity是检查方法,因此无法通过分配器接口直接执行此操作

    围绕这一限制,我可以想到两种方法:

  • 实现您自己的allocateCapacity()和deallocateCapacity(),这意味着您必须重新实现基类的所有功能
  • 在allocate()和deallocate()中抛出未经检查的异常
    • allocate()将IllegalArgumentException转换为CF.Device.InvalidCapacity
    • deallocate()将算术异常和IllegalArgumentException转换为CF.Device.InvalidCapacity

  • 在1.9之前,你必须做#1,所以这不是一个坏方法。#2的问题在于它是一种黑客行为,使用IllegalArgumentException将丢失异常的消息。

    谢谢,贾斯汀。你知道这是否也是红鹰未来版本的计划吗?