了解UnsupportedOperationException

我不太明白我可以在哪里抛出这个exception。

例如,我正在实现Future接口,并且不希望任何人调用该方法:

未来#get(long,TimeUnit) 。

那么,我可以抛出UnsupportedOperationException吗?

 public T get(long timeout, TimeUnit unit){ throw new UnsupportedOperationException(); } 

事情是该方法的规范没有说什么关于抛出exception。 反过来,例外

抛出以指示不支持所请求的操作。

Class UnsupportedOperationException

我的意思是,如果您不希望它被调用或者它可能被认为是错误的,因为并非所有方法都已实现,它是否常见? 在我的具体情况下,我认为调用该方法没有意义……

技术上UnsupportedOperationException未选中,因此可以在任何您喜欢的地方抛出。 但是将它扔到意想不到的地方会导致你的课程不那么容易使用,不推荐使用。

预期将抛出UnsupportedOperationException的位置在“可选操作”中。 Java框架包含大量这些内容,尤其是在Collections框架中。 例如, “add”是一个可选操作 ,因为不可变集合不应该允许它。 如果您不想编写其中一种方法,则抛出UnsupportedOperationException正是您应该执行的操作。

在你的情况下,定时“获取”对于使用Future非常重要,如果你不实现它会引起一些惊喜。 如果你打算这样做,请确保它有详细记录,并注意这将导致你的Future实现在某些情况下无法使用,并可能导致使用它的程序崩溃。

如果您根本没有资源为Future实现编写定时get,请考虑使用已存在的实现,例如从FutureTask扩展您的类。

是的,你是对的。

UnsupportedException的作者是Joshua Bloch,根据他的书以及Collections design FAQ ,如果对象不支持操作,该方法可以抛出UnsupportedException。

在将此exception抛出到方法之前应该小心,因为它的类型为RuntimeException / uncheckedexception。

链接到这本书

本书的作者和UnsupportedException类 Joshua Bloch

 /** * Thrown to indicate that the requested operation is not supported.

* * This class is a member of the * * Java Collections Framework. * * @author Josh Bloch * @version %I%, %G% * @since 1.2 */ public class UnsupportedOperationException extends RuntimeException { ... }

如果希望方法的调用者知道不支持该操作,则可以抛出UnsupportedOperationException。

你可以在这里查看 :

此exception扩展了RuntimeException类,因此属于在Java虚拟机(JVM)操作期间可能抛出的exception。 它是一个未经检查的exception,因此,它不需要在方法或构造函数的throws子句中声明。 此外,自1.2版本的Java以来​​,存在UnsupportedOperationException。