为什么Java StringReader会抛出IOException?

Paw*_*ski 7 java api stringreader

今天我正在使用Java类StringReader,我发现它在read方法上抛出IOException非常烦人.我知道它扩展了Reader类在哪个方法read抛出IOException,但我认为StringReader不需要它.此类不使用任何可能导致错误的外部资源.

短暂调查后,我发现,StringReader#read抛出IOException如果字符串,这个类读取为空,但事实上这是不可能发生的,因为如果我们将试图传递null StringReader构造器,它抛出NPE.

您如何看待它,总是抛出与超类相同的异常是一种好习惯吗?


编辑:如U Mad Reader所述,是一个不是接口的类.

Har*_*ezz 6

我认为,如果您的实现确保它永远不会发生,则抛出与父类或接口定义相同的异常不是一个好习惯。我总是将签名减少到最低要求。

IOException要求所有可以想象的实现,包括文件的来源和溪流及插座等没有,这样的实现不能作为检查的异常通知他们的错误。但是,如果实现不需要抛出检查异常(对于调用代码而言这通常很烦人),则将其从实现类中删除不会带来任何危害,但会减轻一些负担。

更新:

我已经找到方法read()必须抛出IOException:的原因,因为为close()方法定义了协定。从JavaDoc:

关闭流并释放与其关联的所有系统资源。一旦关闭流,进一步的read(),ready(),mark()或reset()调用将引发IOException。关闭先前关闭的流无效。

  • @布拉杰:我不知道怎么了?“ ensureOpen()”没有解释为什么必须抛出“ IOException”。仅当您将代码进一步靠近`close()`方法时,您才能找到真正的原因。而且:它是一个回答问题而不是赢得价格的平台。所以要保持冷静:-) (2认同)

Bra*_*raj 5

请看一下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)