Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #36614
| Path | csiph.com!aioe.org!.POSTED!not-for-mail |
|---|---|
| From | Arne Vajhøj <arne@vajhoej.dk> |
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: Eclipse doesn't like else |
| Date | Sat, 13 May 2017 21:04:52 -0400 |
| Organization | Aioe.org NNTP Server |
| Lines | 165 |
| Message-ID | <of8afj$ec$1@gioia.aioe.org> (permalink) |
| References | <3c792901-a05d-4a02-b058-20b9e0576095@googlegroups.com> |
| NNTP-Posting-Host | PBuS014lhzVyHjLbXmo/ZQ.user.gioia.aioe.org |
| Mime-Version | 1.0 |
| Content-Type | text/plain; charset=utf-8; format=flowed |
| Content-Transfer-Encoding | 7bit |
| X-Complaints-To | abuse@aioe.org |
| User-Agent | Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 |
| X-Notice | Filtered by postfilter v. 0.8.2 |
| Xref | csiph.com comp.lang.java.programmer:36614 |
Show key headers only | View raw
On 5/12/2017 1:44 PM, Eric Douglas wrote:
> Why must it give a warning on this else condition?
>
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
>
> public class CompileMe {
> public static void testMe() {
> try {
> Connection conn = DriverManager.getConnection("db_connect_string", "db_userid", "db_password");
> String someCondition = "check me";
> PreparedStatement myPrep;
> myPrep = conn.prepareStatement("initial query");
> myPrep.executeQuery();
> myPrep.close();
> if (someCondition.equals("one")) {
> myPrep = conn.prepareStatement("query something");
> } else {
> myPrep = conn.prepareStatement("query something else");
> }
> myPrep.executeQuery();
> myPrep.close();
> } catch (SQLException e) {
> e.printStackTrace();
> }
> }
> }
>
> This example will run the same whether we have 2 calls to
> prepareStatement, or set one common string to pass into prepareStatement
> after the if, but if we write it this way Eclipse gives a warning
> "Resource leak: 'myPrep' is not closed at this location".
>
> Take out the 3 lines above the if (prepare, execute, and close a
> different query) and the warning goes away.
As already explained by other then there are a resource leak.
And as I said in another reply then I don't think Eclipse detects
all resource leaks.
But if we take a step back and look at the code then there are
several things that comes to my mind:
* I do not like the reuse of the PreparedStatement ref I would
use different ref's
* all statements and connection need to be closed to avoid resource
leak (well - statements should be closed when connection is
closed per specs, but I would not rely on that)
* the only way to get this right is to have a systematic
approach
Here are 3 different approaches:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class ToCloseOrNotToclose {
// Approach 1:
// * close everything as soon as possible in good flow
// * close in catch block if necessary to handle bad flows
public static void approach1(String cond) {
Connection con = null;
PreparedStatement upd1 = null;
PreparedStatement upd2a = null;
PreparedStatement upd2b = null;
try {
con = DriverManager.getConnection("db_connect_string",
"db_userid", "db_password");
upd1 = con.prepareStatement("initial query");
upd1.executeQuery();
upd1.close();
if (cond.equals("one")) {
upd2a = con.prepareStatement("query something");
upd2a.executeQuery();
upd2a.close();
} else {
upd2b = con.prepareStatement("query something else");
upd2b.executeQuery();
upd2b.close();
}
con.close();
} catch (SQLException e) {
e.printStackTrace();
try {
if(upd1 != null && !upd1.isClosed()) upd1.close();
if(upd2a != null && !upd2a.isClosed()) upd2a.close();
if(upd2b != null && !upd2b.isClosed()) upd2b.close();
if(con != null && !con.isClosed()) con.close();
} catch (SQLException e2) {
e2.printStackTrace();
// consider what to do here
}
// consider what to do here
}
}
// Approach 2:
// * close in finally block for both good and bad flows
public static void approach2(String cond) {
Connection con = null;
PreparedStatement upd1 = null;
PreparedStatement upd2a = null;
PreparedStatement upd2b = null;
try {
con = DriverManager.getConnection("db_connect_string",
"db_userid", "db_password");
upd1 = con.prepareStatement("initial query");
upd1.executeQuery();
if (cond.equals("one")) {
upd2a = con.prepareStatement("query something");
upd2a.executeQuery();
} else {
upd2b = con.prepareStatement("query something else");
upd2b.executeQuery();
}
con.close();
} catch (SQLException e) {
e.printStackTrace();
// consider what to do here
} finally {
try {
if(upd1 != null) upd1.close();
if(upd2a != null) upd2a.close();
if(upd2b != null) upd2b.close();
if(con != null) con.close();
} catch (SQLException e2) {
e2.printStackTrace();
// consider what to do here
}
}
}
// Approach 3:
// * use Java 7+ try with resource
public static void approach3(String cond) {
try (Connection con =
DriverManager.getConnection("db_connect_string", "db_userid",
"db_password")) {
try(PreparedStatement upd1 = con.prepareStatement("initial
query")) {
upd1.executeQuery();
}
if (cond.equals("one")) {
try(PreparedStatement upd2a =
con.prepareStatement("query something")) {
upd2a.executeQuery();
}
} else {
try(PreparedStatement upd2b =
con.prepareStatement("query something else")) {
upd2b.executeQuery();
}
}
} catch (SQLException e) {
e.printStackTrace();
// consider what to do here
}
}
}
Arne
Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Find similar | Unroll thread
Eclipse doesn't like else Eric Douglas <e.d.programmer@gmail.com> - 2017-05-12 10:44 -0700
Re: Eclipse doesn't like else Marcel Mueller <news.5.maazl@spamgourmet.org> - 2017-05-12 20:30 +0200
Re: Eclipse doesn't like else Eric Douglas <e.d.programmer@gmail.com> - 2017-05-12 11:53 -0700
Re: Eclipse doesn't like else Arne Vajhøj <arne@vajhoej.dk> - 2017-05-13 20:39 -0400
Re: Eclipse doesn't like else v_borchert@despammed.com (Volker Borchert) - 2017-05-14 03:50 +0000
Re: Eclipse doesn't like else v_borchert@despammed.com (Volker Borchert) - 2017-05-12 18:15 +0000
Re: Eclipse doesn't like else Eric Douglas <e.d.programmer@gmail.com> - 2017-05-12 13:33 -0700
Re: Eclipse doesn't like else Martin Gregorie <martin@address-in-sig.invalid> - 2017-05-12 21:22 +0000
Re: Eclipse doesn't like else v_borchert@despammed.com (Volker Borchert) - 2017-05-13 00:52 +0000
Re: Eclipse doesn't like else Arne Vajhøj <arne@vajhoej.dk> - 2017-05-13 21:04 -0400
csiph-web