Android - .getInputStream() keeps on crashing
That AsyncTask you posted makes the problem obvious. Commenting out 153 is just hiding the bug.
You're declaring and assigning conn
inside the try block (HttpURLConnection conn = (HttpURLConnection) url.openConnection();
), and disconnecting in your finally
.
But that conn
you've connected to is not visible from the finally block. That means you probably have a member variable with the same name. You're trying to disconnect that instead.
You're getting a NullPointerException because the member is null.
To start with, I'd suggest changing conn
to something else like conn2
to make the problem more obvious (you'll get a compile error on line 153).
The correct solution is to move the declaration and assignment of conn
outside the try block so that it is visible to the finally block, and rejig your catch blocks as appropriate. Something like (I haven't tested this):
protected String doInBackground(String... arg0) {
try {
URL url = new URL("http://www.google.com/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
try {
conn.setDoInput(true);
conn.setDoOutput(true);
input = new InputStreamReader(conn.getInputStream());
in =new BufferedReader(input);
System.out.println("HELLO");
}
finally {
conn.disconnect();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Merelda
Director of Melio Consulting | Data Science Advocate | Machine Learning Evangelist | Entrepreneur
Updated on June 04, 2022Comments
-
Merelda almost 2 years
I'm really new to Android, java and HTML. So I'm pretty much stuffed. I'm just trying to get data from a URL with an android application. I tried the following code in java and it works fine, so I really stuck with what is wrong with it. I tried googling and used different options, such as setting connection time
URL url = new URL("http://www.google.com/"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); try { input = new InputStreamReader(conn.getInputStream()); in =new BufferedReader(input); }
I tried a lot of different versions, such as adding a bunch of stuff like: urlConnection.setRequestProperty("Connection", "keep-alive"); urlConnection.setRequestProperty("ConnectionTimeout", "12000"); urlConnection.setRequestProperty("Content-Length", "" + request.length);
I think the following post has a similar problem: IOException with URLConnection and getInputStream
I didn't get an IOException (well at least I don't think so), but I got this (and a whole bunch of others)
07-01 23:18:33.870: E/AndroidRuntime(30713): java.lang.IllegalStateException: Could not execute method of the activity
And yes, I did add the permission to INTERNET and ACCESS_NETWORK_STATE
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE"/>
I'm using Eclipse and running on my Android HTC One X. Please help. Thanks in advance!
Here's the stack trace after I added the AsyncTask:
07-02 00:02:34.775: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.785: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.785: W/IInputConnectionWrapper(3799): getSelectedText on inactive InputConnection 07-02 00:02:34.785: W/IInputConnectionWrapper(3799): getTextAfterCursor on inactive InputConnection 07-02 00:02:34.790: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.795: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.795: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.795: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.800: W/IInputConnectionWrapper(3799): getSelectedText on inactive InputConnection 07-02 00:02:34.800: W/IInputConnectionWrapper(3799): getTextAfterCursor on inactive InputConnection 07-02 00:02:34.800: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.805: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.805: W/IInputConnectionWrapper(3799): getSelectedText on inactive InputConnection 07-02 00:02:34.810: W/IInputConnectionWrapper(3799): getTextAfterCursor on inactive InputConnection 07-02 00:02:34.810: W/IInputConnectionWrapper(3799): beginBatchEdit on inactive InputConnection 07-02 00:02:34.815: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.815: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.820: W/IInputConnectionWrapper(3799): getSelectedText on inactive InputConnection 07-02 00:02:34.820: W/IInputConnectionWrapper(3799): getTextAfterCursor on inactive InputConnection 07-02 00:02:34.830: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.830: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.830: W/IInputConnectionWrapper(3799): getSelectedText on inactive InputConnection 07-02 00:02:34.835: W/IInputConnectionWrapper(3799): getTextAfterCursor on inactive InputConnection 07-02 00:02:34.845: W/IInputConnectionWrapper(3799): endBatchEdit on inactive InputConnection 07-02 00:02:34.845: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.845: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.850: W/IInputConnectionWrapper(3799): getSelectedText on inactive InputConnection 07-02 00:02:34.850: W/IInputConnectionWrapper(3799): getTextAfterCursor on inactive InputConnection 07-02 00:02:34.855: W/IInputConnectionWrapper(3799): beginBatchEdit on inactive InputConnection 07-02 00:02:34.855: W/IInputConnectionWrapper(3799): setComposingRegion on inactive InputConnection 07-02 00:02:34.855: W/IInputConnectionWrapper(3799): endBatchEdit on inactive InputConnection 07-02 00:02:34.865: W/IInputConnectionWrapper(3799): getExtractedText on inactive InputConnection 07-02 00:02:34.865: W/IInputConnectionWrapper(3799): getTextBeforeCursor on inactive InputConnection 07-02 00:02:34.870: W/IInputConnectionWrapper(3799): getSelectedText on inactive InputConnection 07-02 00:02:34.870: W/IInputConnectionWrapper(3799): getTextAfterCursor on inactive InputConnection 07-02 00:05:06.105: W/LoadedApk(5867): pakageInfo is null! try again 07-02 00:05:06.105: W/LoadedApk(5867): packageInfo still null! 07-02 00:05:06.110: D/LoadedApk(5867): dalvik.system.VMStack.getThreadStackTrace(Native Method) 07-02 00:05:06.110: D/LoadedApk(5867): java.lang.Thread.getStackTrace(Thread.java:599) 07-02 00:05:06.110: D/LoadedApk(5867): android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:388) 07-02 00:05:06.110: D/LoadedApk(5867): android.app.LoadedApk.getClassLoader(LoadedApk.java:330) 07-02 00:05:06.110: D/LoadedApk(5867): android.app.LoadedApk.makeApplication(LoadedApk.java:535) 07-02 00:05:06.110: D/LoadedApk(5867): android.app.ActivityThread.handleBindApplication(ActivityThread.java:4803) 07-02 00:05:06.110: D/LoadedApk(5867): android.app.ActivityThread.access$1300(ActivityThread.java:151) 07-02 00:05:06.110: D/LoadedApk(5867): android.app.ActivityThread$H.handleMessage(ActivityThread.java:1401) 07-02 00:05:06.110: D/LoadedApk(5867): android.os.Handler.dispatchMessage(Handler.java:99) 07-02 00:05:06.110: D/LoadedApk(5867): android.os.Looper.loop(Looper.java:155) 07-02 00:05:06.110: D/LoadedApk(5867): android.app.ActivityThread.main(ActivityThread.java:5493) 07-02 00:05:06.110: D/LoadedApk(5867): java.lang.reflect.Method.invokeNative(Native Method) 07-02 00:05:06.110: D/LoadedApk(5867): java.lang.reflect.Method.invoke(Method.java:511) 07-02 00:05:06.110: D/LoadedApk(5867): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 07-02 00:05:06.110: D/LoadedApk(5867): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795) 07-02 00:05:06.110: D/LoadedApk(5867): dalvik.system.NativeStart.main(Native Method) 07-02 00:05:09.565: I/dalvikvm-heap(6053): Grow heap (frag case) to 5.448MB for 1705652-byte allocation 07-02 00:05:09.810: I/dalvikvm-heap(6053): Grow heap (frag case) to 8.340MB for 3034580-byte allocation 07-02 00:05:09.905: I/MediaPlayer(6053): setLPAflag() in 07-02 00:05:09.905: I/MediaPlayer(6053): mContext is null, can't getMirrorDisplayStatus!!! 07-02 00:05:09.905: I/MediaPlayer(6053): setLPAflag() out 07-02 00:05:09.910: W/MediaPlayer(6053): info/warning (1, 902) 07-02 00:05:09.915: D/MediaPlayer(6053): [DLNA]contentType = 902 07-02 00:05:09.915: D/MediaPlayer(6053): doStart() in 07-02 00:05:09.915: D/MediaPlayer(6053): getIntParameter = 902 07-02 00:05:10.190: D/MediaPlayer(6053): Mediaplayer receives message, message type: 200 07-02 00:05:10.190: I/MediaPlayer(6053): Info (1,902) 07-02 00:05:10.190: D/MediaPlayer(6053): Mediaplayer receives message, message type: 5 07-02 00:05:10.190: D/MediaPlayer(6053): Mediaplayer receives message, message type: 1 07-02 00:05:10.295: E/(6053): file /data/data/com.nvidia.NvCPLSvc/files/driverlist.txt: not found! 07-02 00:05:10.295: I/(6053): Attempting to load EGL implementation /system/lib//egl/libEGL_tegra_impl 07-02 00:05:10.485: I/(6053): Loaded EGL implementation /system/lib//egl/libEGL_tegra_impl 07-02 00:05:10.595: I/(6053): Loading GLESv2 implementation /system/lib//egl/libGLESv2_tegra_impl 07-02 00:05:11.080: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:11.140: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:11.430: I/dalvikvm-heap(6053): Grow heap (frag case) to 10.851MB for 2731536-byte allocation 07-02 00:05:11.830: I/MediaPlayer(6053): setLPAflag() in 07-02 00:05:11.830: I/MediaPlayer(6053): mContext is null, can't getMirrorDisplayStatus!!! 07-02 00:05:11.830: I/MediaPlayer(6053): setLPAflag() out 07-02 00:05:11.845: W/MediaPlayer(6053): info/warning (1, 902) 07-02 00:05:11.870: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:11.875: D/MediaPlayer(6053): Mediaplayer receives message, message type: 200 07-02 00:05:11.875: I/MediaPlayer(6053): Info (1,902) 07-02 00:05:11.875: D/MediaPlayer(6053): Mediaplayer receives message, message type: 5 07-02 00:05:11.875: D/MediaPlayer(6053): Mediaplayer receives message, message type: 1 07-02 00:05:12.025: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:12.600: D/MediaPlayer(6053): [DLNA]contentType = 902 07-02 00:05:12.600: D/MediaPlayer(6053): doStart() in 07-02 00:05:12.600: D/MediaPlayer(6053): getIntParameter = 902 07-02 00:05:12.645: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:12.940: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:12.945: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:12.950: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:12.955: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:12.960: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:12.965: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:12.980: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:12.980: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:12.985: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:12.985: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:12.995: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:13.000: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:13.000: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:13.005: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:13.005: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:13.010: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:13.010: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:13.010: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:13.015: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:13.015: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:13.015: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:13.015: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:13.015: W/IInputConnectionWrapper(6053): beginBatchEdit on inactive InputConnection 07-02 00:05:13.020: W/IInputConnectionWrapper(6053): endBatchEdit on inactive InputConnection 07-02 00:05:13.020: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:13.020: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:13.020: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:13.020: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:13.025: W/IInputConnectionWrapper(6053): beginBatchEdit on inactive InputConnection 07-02 00:05:13.025: W/IInputConnectionWrapper(6053): setComposingRegion on inactive InputConnection 07-02 00:05:13.025: W/IInputConnectionWrapper(6053): endBatchEdit on inactive InputConnection 07-02 00:05:13.025: W/IInputConnectionWrapper(6053): getExtractedText on inactive InputConnection 07-02 00:05:13.025: W/IInputConnectionWrapper(6053): getTextBeforeCursor on inactive InputConnection 07-02 00:05:13.025: W/IInputConnectionWrapper(6053): getSelectedText on inactive InputConnection 07-02 00:05:13.025: W/IInputConnectionWrapper(6053): getTextAfterCursor on inactive InputConnection 07-02 00:05:13.165: E/SpannableStringBuilder(6053): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 07-02 00:05:13.165: E/SpannableStringBuilder(6053): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 07-02 00:05:13.295: D/MediaPlayer(6053): Mediaplayer receives message, message type: 2 07-02 00:05:16.440: W/System.err(6053): java.io.FileNotFoundException: http://www.google.com/ 07-02 00:05:16.445: W/System.err(6053): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 07-02 00:05:16.445: W/System.err(6053): at aiti.mit.edu.sa.wu.calculator.MyAsynTask.doInBackground(ActivityHi.java:139) 07-02 00:05:16.445: W/System.err(6053): at aiti.mit.edu.sa.wu.calculator.MyAsynTask.doInBackground(ActivityHi.java:1) 07-02 00:05:16.445: W/System.err(6053): at android.os.AsyncTask$2.call(AsyncTask.java:287) 07-02 00:05:16.445: W/System.err(6053): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 07-02 00:05:16.445: W/System.err(6053): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 07-02 00:05:16.445: W/System.err(6053): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 07-02 00:05:16.445: W/System.err(6053): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 07-02 00:05:16.450: W/System.err(6053): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 07-02 00:05:16.450: W/System.err(6053): at java.lang.Thread.run(Thread.java:864) 07-02 00:05:16.450: W/dalvikvm(6053): threadid=12: thread exiting with uncaught exception (group=0x40c392d0) 07-02 00:05:16.460: E/AndroidRuntime(6053): FATAL EXCEPTION: AsyncTask #1 07-02 00:05:16.460: E/AndroidRuntime(6053): java.lang.RuntimeException: An error occured while executing doInBackground() 07-02 00:05:16.460: E/AndroidRuntime(6053): at android.os.AsyncTask$3.done(AsyncTask.java:299) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 07-02 00:05:16.460: E/AndroidRuntime(6053): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.lang.Thread.run(Thread.java:864) 07-02 00:05:16.460: E/AndroidRuntime(6053): Caused by: java.lang.NullPointerException 07-02 00:05:16.460: E/AndroidRuntime(6053): at aiti.mit.edu.sa.wu.calculator.MyAsynTask.doInBackground(ActivityHi.java:153) 07-02 00:05:16.460: E/AndroidRuntime(6053): at aiti.mit.edu.sa.wu.calculator.MyAsynTask.doInBackground(ActivityHi.java:1) 07-02 00:05:16.460: E/AndroidRuntime(6053): at android.os.AsyncTask$2.call(AsyncTask.java:287) 07-02 00:05:16.460: E/AndroidRuntime(6053): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 07-02 00:05:16.460: E/AndroidRuntime(6053): ... 5 more 07-02 00:05:19.770: D/Process(6053): killProcess, pid=6053 07-02 00:05:19.800: D/Process(6053): dalvik.system.VMStack.getThreadStackTrace(Native Method) 07-02 00:05:19.800: D/Process(6053): java.lang.Thread.getStackTrace(Thread.java:599) 07-02 00:05:19.800: D/Process(6053): android.os.Process.killProcess(Process.java:944) 07-02 00:05:19.800: D/Process(6053): com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:108) 07-02 00:05:19.800: D/Process(6053): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 07-02 00:05:19.800: D/Process(6053): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 07-02 00:05:20.290: I/dalvikvm-heap(6336): Grow heap (frag case) to 5.287MB for 1536016-byte allocation 07-02 00:05:20.375: I/dalvikvm-heap(6336): Grow heap (frag case) to 7.890MB for 2731536-byte allocation 07-02 00:05:20.590: I/MediaPlayer(6336): setLPAflag() in 07-02 00:05:20.590: I/MediaPlayer(6336): mContext is null, can't getMirrorDisplayStatus!!! 07-02 00:05:20.590: I/MediaPlayer(6336): setLPAflag() out 07-02 00:05:20.590: W/MediaPlayer(6336): info/warning (1, 902) 07-02 00:05:20.635: D/MediaPlayer(6336): Mediaplayer receives message, message type: 200 07-02 00:05:20.635: I/MediaPlayer(6336): Info (1,902) 07-02 00:05:20.635: D/MediaPlayer(6336): Mediaplayer receives message, message type: 5 07-02 00:05:20.635: D/MediaPlayer(6336): Mediaplayer receives message, message type: 1 07-02 00:05:20.685: E/(6336): file /data/data/com.nvidia.NvCPLSvc/files/driverlist.txt: not found! 07-02 00:05:20.685: I/(6336): Attempting to load EGL implementation /system/lib//egl/libEGL_tegra_impl 07-02 00:05:20.735: I/(6336): Loaded EGL implementation /system/lib//egl/libEGL_tegra_impl 07-02 00:05:20.820: I/(6336): Loading GLESv2 implementation /system/lib//egl/libGLESv2_tegra_impl 07-02 00:05:21.215: E/SpannableStringBuilder(6336): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 07-02 00:05:21.215: E/SpannableStringBuilder(6336): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 07-02 00:05:22.575: E/SpannableStringBuilder(6336): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 07-02 00:05:22.575: E/SpannableStringBuilder(6336): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
and this is AsyncTank...
protected String doInBackground(String... arg0) { try { URL url = new URL("http://www.google.com/"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); input = new InputStreamReader(conn.getInputStream()); in =new BufferedReader(input); System.out.println("HELLO"); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { conn.disconnect(); } return null; }
-
Admin almost 11 yearsIf you are referring to StrictMode - it would throw a android.os.NetworkOnMainThreadException, rather than a FileNotFoundException.
-
Merelda almost 11 yearsI tried to comment out that line but it doesn't help even after I added a readStream() method. My brain is too stuffed right now, will come back to it tomorrow morning. Thanks for the help, really appreciated!
-
Merelda almost 11 yearsOh in any case, it seems like I still got the data! Is it really necessary to add .disconnect()?
-
Admin almost 11 yearsYes. Just check if it is null before calling disconnect (see my comment response to your question).
-
Martin almost 11 yearsYes, you must call disconnect (otherwise you're going to start leaking resources). Don't put in the test for null though - it will result in you never calling disconnect in your case (or calling it on the wrong connection). See my answer for details.
-
Merelda almost 11 yearsI had to add a } before finally to get it to run, but this totally works! Thanks!!