Java – Android: How to catch this exception

Android: How to catch this exception… here is a solution to the problem.

Android: How to catch this exception

I hope it will be simple.

I reused the code from the tutorial that parses and displays RSS in a ListView
When running code from behind a proxy or without internet, I get the following crash report:

12-12 09:48:57.372: W/RssApp(1494): Exception while retrieving the input stream
12-12 09:48:57.372: W/RssApp(1494): java.net.ConnectException: failed to connect to gigglepics.co.uk/188.121.41.139 (port 80): connect failed: ETIMEDOUT (Connection timed out)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.io.IoBridge.connect(IoBridge.java:114)
12-12 09:48:57.372: W/RssApp(1494):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
12-12 09:48:57.372: W/RssApp(1494):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
12-12 09:48:57.372: W/RssApp(1494):     at java.net.Socket.connect(Socket.java:842)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
12-12 09:48:57.372: W/RssApp(1494):     at eu. MasterZangetsu.RssService.getInputStream(RssService.java:48)
12-12 09:48:57.372: W/RssApp(1494):     at eu. MasterZangetsu.RssService.onHandleIntent(RssService.java:33)
12-12 09:48:57.372: W/RssApp(1494):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
12-12 09:48:57.372: W/RssApp(1494):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-12 09:48:57.372: W/RssApp(1494):     at android.os.Looper.loop(Looper.java:137)
12-12 09:48:57.372: W/RssApp(1494):     at android.os.HandlerThread.run(HandlerThread.java:60)
12-12 09:48:57.372: W/RssApp(1494): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.io.Posix.connect(Native Method)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
12-12 09:48:57.372: W/RssApp(1494):     at libcore.io.IoBridge.connect(IoBridge.java:112)
12-12 09:48:57.372: W/RssApp(1494):     ... 20 more
12-12 09:48:57.382: W/dalvikvm(1494): threadid=11: thread exiting with uncaught exception (group=0x40a71930)
12-12 09:48:57.402: E/AndroidRuntime(1494): FATAL EXCEPTION: IntentService[RssService]
12-12 09:48:57.402: E/AndroidRuntime(1494): java.lang.NullPointerException
12-12 09:48:57.402: E/AndroidRuntime(1494):     at eu. MasterZangetsu.PcWorldRssParser.parse(PcWorldRssParser.java:33)
12-12 09:48:57.402: E/AndroidRuntime(1494):     at eu. MasterZangetsu.RssService.onHandleIntent(RssService.java:33)
12-12 09:48:57.402: E/AndroidRuntime(1494):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
12-12 09:48:57.402: E/AndroidRuntime(1494):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-12 09:48:57.402: E/AndroidRuntime(1494):     at android.os.Looper.loop(Looper.java:137)
12-12 09:48:57.402: E/AndroidRuntime(1494):     at android.os.HandlerThread.run(HandlerThread.java:60)

This happens with inputStream.close();

    public List<RssItem> parse(InputStream inputStream)
        throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(inputStream, null);
        parser.nextTag();
        return readFeed(parser);
    } finally {
        inputStream.close();

}
}

What I want to do is catch this exception to make sure the app doesn’t crash but instead displays an error message

Everything I tried still seems to crash and give a completely different error. I must have missed something very basic

Solution

The code is missing the actual catch statement:

try {
    XmlPullParser parser = Xml.newPullParser();
    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
    parser.setInput(inputStream, null);
    parser.nextTag();
    return readFeed(parser);
}catch(IllegalArgumentException e){ //Replace this with the more specific exception
  do something
}catch(Excpetion e){ //You can have multiple catch blocks from specific to general
  do something
}finally {
    inputStream.close();

}

After adding this code, you still get an error because inputStream is null and throws a NullPointerException in finally block. There are two ways to deal with this.

The first is to simply catch NullPointerException: in finally block

try {
    XmlPullParser parser = Xml.newPullParser();
    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
    parser.setInput(inputStream, null);
    parser.nextTag();
    return readFeed(parser);
}catch(IllegalArgumentException e){ //Replace this with the more specific exception
  do something
}catch(Excpetion e){ //You can have multiple catch blocks from specific to general
  do something
}finally {
    try{
       inputStream.close();
    }catch(Exception e){
       do something 
    }
}

The second is to add a protection condition at the beginning of the method that does not accept an empty InputStream.

public List<RssItem> parse(InputStream inputStream)
    throws IllegalArgumentException {

if(inputStream == null){
        throw new IllegalArgumentException();
    }
}

It can be called like this:

  try{
        someObject.parse(null);
  }catch(IllegalArgumentException e){
      do something
  }

Related Problems and Solutions