Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: IOException when writing to a ByteArrayOutputStream?

Since ByteArrayOutputStream simply writes to memory, an IOException should never occur. However, because of the contract of the OutputStream interface, all stream operations define IOException in their throws clause.

What is the correct way to "handle" this never-occurring IOException? Simply wrap operations in an empty try-catch block?

Or are there any actual situations where ByteArrayOutputStream could throw an exception?

(See also: How can I handle an IOException which I know can never be thrown, in a safe and readable manner?)

EDIT

As Jon points out, ByteArrayOutputStream doesn't declare a throws clause on the write methods it defines -- however, it inherits write(byte[]) from OutputStream, and that one does throw IOEXception (quite odd that BAOS wouldn't override this method, as it could replace the superclass version -- which writes one byte at a time -- with a far more efficient arraycopy call)

like image 469
Tony the Pony Avatar asked Jun 07 '11 21:06

Tony the Pony


2 Answers

Well, ByteArrayOutputStream doesn't declare that any of its methods throw IOException except writeTo and close. (I don't know why close still declares it, to be honest.)

If you've got a reference of type OutputStream though, you would still see the throws declarations from that, of course.

I wouldn't use an empty catch block - I'd throw something like IllegalStateException or a similar unchecked exception: it means you're in a situation you really don't expect, and something's gone badly wrong.

like image 109
Jon Skeet Avatar answered Sep 22 '22 08:09

Jon Skeet


Since Java 11, there is also a new method ByteArrayOutputStream.writeBytes(byte[]) which does not throw an IOException as well:

/**
 * Writes the complete contents of the specified byte array
 * to this {@code ByteArrayOutputStream}.
 *
 * ...
 *
 * @since   11
 */
public void writeBytes(byte b[]) {
    write(b, 0, b.length);
}

You could use this method if you don't want to handle an IOException which is never thrown.

like image 41
ZhekaKozlov Avatar answered Sep 19 '22 08:09

ZhekaKozlov