2013-12-12 2 views
2

나는 이것이 간단한 하나가되기를 바라고 있습니다. Android :이 예외를 잡는 방법

I 새롭게 사용하여 프록시 뒤에서 또는 나는 다음과 같은 충돌 보고서 얻을 수없는 인터넷으로 코드를 실행하면 목록보기 에 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(); 

    } 
} 

내가하고 싶은 모든 충돌하지 않는 응용 프로그램을 보장하기 위해이 예외를 캐치하고 대신에 내가 시도

모든 여전히 충돌 나타나는 오류 메시지가 표시되고 완전히 다른 오류가 있습니다. 정말 기본적인 뭔가를 놓친해야

코드는 실제 catch 문없는
+3

finally 블록 안에 try/catch 블록을 추가하는 데 부끄러운 점이 없습니다. :). 확인 [이] (http://stackoverflow.com/questions/6095664/putting-try-catch-finally-block-inside-another-finally-block) –

+0

아래 Kevin Bowersox 코멘트에 명시된 바와 같이 문제는 inputStream에 없습니다. .닫기(); –

+0

나는 그가 효과가 없다고 제안한 것을 덧붙였다. 다른 제안? –

답변

3

:이 코드를 추가되면 inputStream가 null로, finally 블록에 NullPointerException을 발생하기 때문에

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(); 

} 

는 여전히 오류가 발생을 . 이것을 처리 할 수있는 두 가지 방법이 있습니다.

제 단순히 finally 블록에서 NullPointerException 잡을이다

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 { 

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

} 
finally { 
    inputStream.close(); 
} 
+0

이 메서드는 XmlPullParserException, IOException을 throw합니다. Excpetion을 잡을 필요가 없습니다. – Prabhakaran

+0

@Prabhakaran 방금 여러 예외를 잡는 방법을 보여주기 위해 사용했습니다. –

+0

멋지 네요. @ 케빈 보워 섹스 – Prabhakaran

0

는 않습니다.

try{ 
    // your implementation 
}catch(Exception e){ 
    // handle the exception 
}finally{ 
try{ 
    // do what ever the thing should diffidently happens 
    }catch(Exception e){ 

    } 
} 
+2

왜 downvote? 설명을 신경 써라. – Prabhakaran

+0

나는 투표를하지는 않았지만 그의 예외는 finally 블록에서왔다. –

+0

이 라인에서 어떻게 IllegalArgumentException을 얻을 것이다. inputStream.close(); – Prabhakaran

0

그냥 다음 catch 특정 exceptioncatch 블록을 넣어 같이

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

왜 downvote ?? – Jhanvi

+1

오오. 여기에 정신 문제가있는 사람. 여기에 각각의 답을 내려 받았다. –