Еще одна причина в том, что System.out и err являются PrintStreams, которые используют все лежащие в основе исключения IOException.Смотрите следующие методы PrintStreams:
<code>/**
* Writes the specified byte to this stream. If the byte is a newline and
* automatic flushing is enabled then the <code>flush</code> method will be
* invoked.
*
* <p> Note that the byte is written as given; to write a character that
* will be translated according to the platform's default character
* encoding, use the <code>print(char)</code> or <code>println(char)</code>
* methods.
*
* @param b The byte to be written
* @see #print(char)
* @see #println(char)
*/
public void write(int b) {
try {
synchronized (this) {
ensureOpen();
out.write(b);
if ((b == '\n') && autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
/**
* Flushes the stream and checks its error state. The internal error state
* is set to <code>true</code> when the underlying output stream throws an
* <code>IOException</code> other than <code>InterruptedIOException</code>,
* and when the <code>setError</code> method is invoked. If an operation
* on the underlying output stream throws an
* <code>InterruptedIOException</code>, then the <code>PrintStream</code>
* converts the exception back into an interrupt by doing:
* <pre>
* Thread.currentThread().interrupt();
*
* или эквивалентный.* * @return
true
тогда и только тогда, когда в этом потоке обнаружен *
IOException
, отличный от *
InterruptedIOException
, или был вызван метод *
setError
* / public boolean checkError () {if (out! =null) flush ();if (out instanceof java.io.PrintStream) {PrintStream ps = (PrintStream) out;return ps.checkError ();} вернуть неприятности;}
Таким образом, IOException из базового потока используется ВСЕГДА, и обычно люди никогда не вызывают checkError в System out, поэтому они даже не знают, что что-то случилось.