安卓:我该如何捕获这个异常

3

我希望这是一个简单的问题。

我正在重用来自教程的代码,该代码解析并在列表视图中显示RSS。如果在代理后面或没有互联网的情况下运行代码,我会获得以下崩溃报告:

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)

这是发生在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();

    }
}

我想做的就是捕获这个异常,以确保应用程序不会崩溃,而是显示错误消息。无论我尝试什么,似乎都会崩溃并显示完全不同的错误。我一定漏掉了某些基本要素。

3
在 finally 块中添加 try/catch 块并没有什么丢脸的。请参考 这个链接 - Mohamed_AbdAllah
正如Kevin Bowersox在下面的评论中所述,你的问题不在于inputStream.close(); - Mohamed_AbdAllah
我按照他的建议添加了内容,但没有效果。还有其他建议吗? - Master Zangetsu
3个回答

4
代码缺少实际的catch语句:
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();

}

一旦您添加了这段代码,仍然会收到错误提示,因为为空,会在块中抛出。解决此问题有两种方法。
第一种方法是简单地在块中捕获:
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 
    }
}

第二个是在方法开始时添加防护条件,不接受空的InputStream
public List<RssItem> parse(InputStream inputStream)
    throws IllegalArgumentException {

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

这可以被称为:

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

该方法会抛出 XmlPullParserException 和 IOException 异常,无需捕获 Exception。 - Prabhakaran Ramaswamy
@Prabhakaran 我只是用它来演示捕获多个异常。 - Kevin Bowersox
@MasterZangetsu 很高兴我能帮到你。 - Kevin Bowersox

0

像这样做

try {

}catch(IllegalArgumentException e){ //Added this catch block.

} 
finally {
    inputStream.close();
}

我没有点踩,但他的异常是来自 finally 块。 - Mohamed_AbdAllah
你将如何从这行代码中得到IllegalArgumentException:inputStream.close(); - Prabhakaran Ramaswamy
@Mohamed_AbdAllah 我不同意,看一下堆栈跟踪。at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1615) - Kevin Bowersox
4
我被撞了,估计有人早上过得不太好。 - Kevin Bowersox

0
只需放置一个catch块,然后捕获特定的exception
try{
  // your implementation
}catch(Exception e){
  // handle the exception
}finally{
 try{
   // do what ever the thing should diffidently happens  
   }catch(Exception e){

   }
}

1
哦,拜托了。这里有人有心理问题。给每个答案都点了踩。 - Ruchira Gayan Ranaweera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接