Paw*_*ski 7 java api stringreader
今天我正在使用Java类StringReader,我发现它在read方法上抛出IOException非常烦人.我知道它扩展了Reader类在哪个方法read抛出IOException,但我认为StringReader不需要它.此类不使用任何可能导致错误的外部资源.
短暂调查后,我发现,StringReader#read抛出IOException如果字符串,这个类读取为空,但事实上这是不可能发生的,因为如果我们将试图传递null StringReader构造器,它抛出NPE.
您如何看待它,总是抛出与超类相同的异常是一种好习惯吗?
编辑:如U Mad Reader所述,是一个不是接口的类.
我认为,如果您的实现确保它永远不会发生,则抛出与父类或接口定义相同的异常不是一个好习惯。我总是将签名减少到最低要求。
将IOException要求所有可以想象的实现,包括文件的来源和溪流及插座等没有,这样的实现不能作为检查的异常通知他们的错误。但是,如果实现不需要抛出检查异常(对于调用代码而言这通常很烦人),则将其从实现类中删除不会带来任何危害,但会减轻一些负担。
更新:
我已经找到方法read()必须抛出IOException:的原因,因为为close()方法定义了协定。从JavaDoc:
关闭流并释放与其关联的所有系统资源。一旦关闭流,进一步的read(),ready(),mark()或reset()调用将引发IOException。关闭先前关闭的流无效。
请看一下StringReader#read()。
查看StringReader#read()方法的源代码。它调用ensureOpen()实际抛出的方法,IOException因为ensureOpen()检查以确保流尚未关闭。
如果 reader 被关闭然后 afterread()再次被调用,那么会发生什么?
源代码直接来自上面的链接(看评论):
/**
* Reads a single character.
*
* @return The character read, or -1 if the end of the stream has been
* reached
*
* @exception IOException If an I/O error occurs
*/
public int read() throws IOException {
synchronized (lock) {
ensureOpen();
if (next >= length)
return -1;
return str.charAt(next++);
}
}
/** Check to make sure that the stream has not been closed */
private void ensureOpen() throws IOException {
if (str == null)
throw new IOException("Stream closed");
}
/**
* Closes the stream and releases any system resources associated with
* it. Once the stream has been closed, further read(),
* ready(), mark(), or reset() invocations will throw an IOException.
* Closing a previously closed stream has no effect.
*/
public void close() {
str = null;
}
Run Code Online (Sandbox Code Playgroud)