了解UnsupportedOperationException

时间:2015-09-29 14:39:59

标签: java exception interface

我不太明白我可以在哪里抛出此异常。

例如,我正在实施Future<T>界面,并且不希望任何人调用该方法:

Future#get(long, TimeUnit)

那么,我可以抛出UnsupportedOperationException吗?

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

事情是该方法的规范并没有说出抛出异常的任何内容。异常,反过来

  

抛出表示不支持请求的操作。

Class UnsupportedOperationException

我的意思是,如果您不希望它被调用或者可能被认为是错误的,那么抛出它是否常见,因为并非所有方法都已实施?在我的具体案例中,我不认为调用这种方法会有意义......

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:7)

是的,你是对的。

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

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

Link to the book

本书的作者和UnsupportedException类 Joshua Bloch

/**
 * Thrown to indicate that the requested operation is not supported.<p>
 *
 * This class is a member of the
 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
 * Java Collections Framework</a>.
 *
 * @author  Josh Bloch
 * @version %I%, %G%
 * @since   1.2
 */
public class UnsupportedOperationException extends RuntimeException {
     ...
}

答案 2 :(得分:4)

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

您可以查看here

  

此异常扩展了RuntimeException类,因此属于   在Java的操作期间可以抛出的那些异常   虚拟机(JVM)。这是一个未经检查的例外,因此确实如此   不需要在方法或构造函数的抛出中声明   条款。此外,自从支持UnsupportedOperationException以来   1.2版本的Java。