Dmitry1405
Dmitry1405

Reputation: 266

Should we ignore IOException while close Buffered stream?

I load a xml content, and save it to the disk. Then I read it, and try to parse. When I have successfully parsed xml, should I ignore IOException in 7 line?

 catch (IOException ignore) {}

Or some problems may occured?

private HashMap <String, VideoDto> loadContent(String url){
    try {
        BufferedInputStream bStream = httpGateway.loadContents();
        cachedContent = xmlParser.parseVideos(bStream);
        try {
            bStream.close();
        } catch (IOException ignore) {}
        return cachedContent;
    } catch (XMLStreamException e) {
        throw new IllegalStateException("I/O error during integration", e);
    }
}


public BufferedInputStream loadContents() {
    URL source = config.getContentPath();
    URL target= config.getLastImportedFile();
    try {
        ReadableByteChannel rbc = Channels.newChannel(source.openStream());
        FileOutputStream fos = new FileOutputStream(target.getFile());
        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
    } catch (MalformedURLException e) {
        throw new IllegalArgumentException("Wrong url format", e);
    } catch (IOException e) {
        throw new IllegalArgumentException("I/O error while saving "+target, e);
    }

   return createBufferStream(config.getLastImportedFile());
}

private BufferedInputStream createBufferStream(URL url){
    try {
        return new BufferedInputStream(url.openConnection().getInputStream());
    } catch (IOException e) {
        throw new IllegalArgumentException(e);
    }
}

Upvotes: 4

Views: 971

Answers (5)

Max
Max

Reputation: 2146

In Effective Java Joshua Bloch gives this as an example of an exception you might want to log and ignore. He says, however, that in general you want to do more than just logging an exception.

Upvotes: 0

Stephen C
Stephen C

Reputation: 719561

There are three parts to this question:

Q1: Should one ever ignore (squash) an exception?

I think that the answer is ... "it depends".

If the exception cause is known AND it you can catch it precisely (i.e. without also catching exceptions with different causes) AND the correct thing to do is to ignore it then ... IMO ... Yes it is acceptable.

Otherwise. No.

Q2: What does and IOException mean in this case, and does it matter?

The answer is that it is not at all clear. Under normal circumstances, one would not expect an IOException when closing an input stream, and it is hard to know what it might mean. Intuitively it is probably harmless. On the other hand, if you don't know what might cause something it is hard to say whether or not it matters.

Q3: Should you simply ignore this IOException?

I would say no. But I would handle it like this:

    } catch (IOException ex) {
        // possibly log the exception here.
        throw new AssertionError("Unexpected exception", ex);
    }

The rationale is that if something totally unexpected does occur, then it would be a good thing if the developer / maintainer could find out, and figure out how to deal with it.

On the other hand, if you could make an a priori assessment that any IOException here is harmless, then simply logging (or even squashing) it might be sufficient.

Upvotes: 2

StuPointerException
StuPointerException

Reputation: 7267

This means that the stream will (probably) still be open, whether that is a problem in your program only you will know. At the very least you should log the exception, otherwise you might get strange results that are hard to detect.

You might also want to look at the try-with-resources syntax which doesn't pose this dilemma:

try (BufferedInputStream bStream = httpGateway.loadContents()) {
    cachedContent = xmlParser.parseVideos(bStream);
}

Upvotes: 0

user1907906
user1907906

Reputation:

Use the try syntax that exists since Java 7:

try (BufferedInputStream bStream = httpGateway.loadContents();) {
    cachedContent = xmlParser.parseVideos(bStream);
}

With this you don't have to call .close() manually.

You should catch all exceptions that are thrown inside the try block, though.

Upvotes: 0

Mordechai
Mordechai

Reputation: 16294

Never ignore exceptions, even if nothing goes wrong. This is the seed of bugs.

The desired thing to do, if you don't need any actions to be done, is, print its stack trace.

e.printStackTrace();

You may ignore that at any time, but may help you in the long run.

Upvotes: 0

Related Questions