Re: Exception Names
Arne Vajh?j wrote:
Mike Schilling wrote:
Lew wrote:
rossum wrote:
On Fri, 27 Mar 2009 11:58:20 +0000, Tom Anderson
<twic@urchin.earth.li> wrote:
InputStream.read should throw an EOFException instead of
returning
-1 at the end of a stream. Checking return values for special
values is goofy C bullshit that we shouldn't be doing in the
21st
century.
It may bee goofy but it is very likely to be a whole lot faster.
Throwing and catching an exception is probably going to be a lot
slower than checking the return value.
Besides, there's nothing exceptional about reaching the end of a
stream. One would venture to say that one nearly always reaches
the
end of a stream, *unless* something exceptional happens.
Right; the most Java-ish thing would be for Streams to be
iterator-like:
while (stream.hasNext())
{
char c = stream.next();
}
or even
for (char c: stream)
{
}
1) performance would most likely not be good.
Because of two method calls rather than one? (I'm assuming streams
wouldn't have to implement java.util.Iterator, so that next() could
return a byte rather than a Byte.)
2) semantics could become very confusing - either hexNext
would do the actual read or for some types of streams next
could fail even ig hasNext returned true
The semantics would have to be well-defined. Since we're not assuming
any asynchrony, I'd expect hasNext() to do actual I/O, if that's
necessary to ensure that a character is available. (This is hidden
when the for loop is used, anyway.)
The result is something like:
public Interface ByteSource
{
boolean hasNext() throws IOException;
byte next() thoews IOException;
}
And the adaptor is simply
public ByteSourceIterator InputStreamByteSource
{
pivate InputStream strm;
private int c;
private boolean atEOF;
public InputStreamByteSource(InputStream is)
{
strm = is;
c = -1;
atEOF = false;
}
public boolean hasNext() throws IOException;
{
if (atEOF)
return false;
if (c < 0)
c = getNextByte();
return c >= 0;
}
public byte next()
{
if (!atEOF && c < 0)
c = getNextByte();
if (c < 0)
throw new NoSuchElementException();
byte r = c;
c = -1;
return r;
}
private byte getNextByte() throws IOException
{
if (atEOF)
return -1;
byte b;
try
{
b = strm.read();
}
catch (IOException ex)
{
atEOF = true;
strm.close();
throw ex;
}
if (b < 0)
{
atEOF = true;
strm.close();
}
return b;
}
}