接口没有声明它会抛出,但文档说它可以抛出

时间:2013-09-04 21:16:57

标签: java exception

(它确实扔了)

根据我使用Java的经验,如果你在实现接口的类的方法中抛出Exception,那么覆盖接口的方法也必须声明它抛出{{1} }。

例如,请考虑以下最小示例:

Exception

但是,我注意到java.nio的ByteBuffer.get()没有声明它会抛出任何异常:

public interface MyInterface {
    void doSomething() throws IOException;
}


public class MyClass implements MyInterface {
    @Override
    public void doSomething() throws IOException {
        throw new IOException();
    }
}

但是,它的文档说明如下:

public abstract byte get();

然后我检查了HeapByteBuffer.get()的实现:

Throws:
    BufferUnderflowException If the buffer's current position is not smaller than its limit

我们发现nextGetIndex()实际上是抛出public byte get() { return hb[ix(nextGetIndex())]; } 的方法,顺便说一下,它也没有用BufferUnderflowException声明:

throws BufferUnderflowException

问题

那么,我在这里错过了什么?如果我尝试声明抛出final int nextGetIndex() { // package-private if (position >= limit) throw new BufferUnderflowException(); return position++; } 的方法,我会收到错误

Exception

这是仅限IDE的错误吗?我正在使用Eclipse Juno。我认为如果只是IDE它会是一个警告,但这是一个实际的错误。

ByteBuffer.get()如何不用Unhandled exception type Exception 声明其接口,但同时抛出(而不是捕获它)?

1 个答案:

答案 0 :(得分:10)

您只需要在方法中声明Checked Exception,而不是Unchecked。 BufferUnderflowException是一个未经检查的异常(它扩展RuntimeException),因此不需要声明它被抛出,也不需要处理它。

<强>参考: