Path: csiph.com!eternal-september.org!feeder.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Andreas Leitgeb Newsgroups: comp.lang.java.programmer Subject: Re: Is this the way to work with try with resources Date: Wed, 9 Aug 2017 16:51:38 -0000 (UTC) Organization: A noiseless patient Spider Lines: 55 Message-ID: References: <87poc6wb9n.fsf@munus.decebal.nl> <87lgmtwels.fsf@munus.decebal.nl> <8760dxuhzl.fsf@munus.decebal.nl> Reply-To: avl@logic.at Injection-Date: Wed, 9 Aug 2017 16:51:38 -0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="92e6e7582d029eb5248e6cf55664ba3c"; logging-data="4511"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/HZW8MkmcxrWlIwgz355vv" User-Agent: slrn/1.0.2 (Linux) Cancel-Lock: sha1:GuLaqVsFRa15rhK7AIL3OrvK32E= Xref: csiph.com comp.lang.java.programmer:37112 Cecil Westerhof wrote: > Andreas Leitgeb writes: >> Cecil Westerhof wrote: >>> private static void statistics() { >>> try (ResultSet rsTotal = executeQuery(COUNT_TOTAL_PROV); >>> ResultSet rsUnused = executeQuery(COUNT_UNUSED_PROV); >>> ResultSet rsUsed = executeQuery(COUNT_USED_PROV)) { >> and >>> private static ResultSet executeQuery(String query) throws SQLException { >>> return conn.createStatement().executeQuery(query); >>> } >> So, if one of the queries fails, what will happen to the statements >> created so far? >> Or, rather, what will *not* happen to them? > If I interpreted try with resources correctly they are destroyed and > nothing is done with them. This claim is self-contradictory. They cannot be both, "destroyed" and "nothing done with them" at the same time. Anyway, I think, we're conflating two aspects here: 1.) your app is a simple client tool, which wouldn't really need any error-handling with explicit cleanup at all. It could just System.exit() for any exception, and all cleanup will be cared for. 2.) The discussion on how to do try-with-ressources *correctly*. I'd prefer to stick with "2.)" and ignore the fact that your specific task doesn't really demand correctness. Ok? (Otherwise there's no point in participating in the discussion any longer.) Now, in that snippet above, it would (3 times) create a statement, then execute a query to get a resultset. If one of the queries went wrong, then the try would auto-close any previously obtained resultsets, but it would not do anything on the statements - in particular: not clean them up. So, if instead it were a long running server app, it would leak up to three statements each time your proc is run, until it eventually closes and reopens the connection. >>> format = String.format("There are %%,%dd %%-6s proverbs.%%n", >>> String.format("%,d", count).length()); >>> System.out.printf(format, count, "total"); >> What's the point of determining the length of e.g. "1,234,567" just to >> set it as the length for a "%,d", which would obviously produce exactly >> that length, anyway? > Because I use it for the second and third. Ah, first row is always the widest value? Ok, that's a justification. But even then I'd probably have used: int maxLen = String.format("%,d", count).length(); // first count is largest format = "There are %," + maxLen + "d %-6s proverbs.%n"; for slightly better readability.