(它确实扔了)
根据我使用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
声明其接口,但同时抛出(而不是捕获它)?
答案 0 :(得分:10)
您只需要在方法中声明Checked Exception,而不是Unchecked。 BufferUnderflowException
是一个未经检查的异常(它扩展RuntimeException
),因此不需要声明它被抛出,也不需要处理它。
<强>参考:强>