我想要以下方法返回HttpResponse
。但与此同时,我不想将HttpResponse
初始化为null
这是一种很好的方法,为方法添加throws
或添加try/catch
块,其中HttpResponse
已初始化为null
。
HttpResponse
是一个界面,所以初始化这个没有任何意义
我很期待为HttpResponse
添加getter / setter,将其声明为成员变量。
我们很感激。
public HttpResponse executeRestClientServiceCall(final HttpUriRequest request)
{
// Verifier;
HttpResponse httpResponse = null;
final HttpClient client = new DefaultHttpClient();
try
{
httpResponse = client.execute(request);
return httpResponse;
}
catch (final ClientProtocolException e)
{
}
catch (final IOException e)
{
}
return httpResponse;
}
答案 0 :(得分:2)
此时你不应该抓住异常。一点也不。这使您的代码更加简单。您需要做的是释放您使用的所有资源,并正确执行。这是执行此操作的代码:
@Nonnull
public HttpResponse executeRestClientServiceCall(HttpUriRequest request) throws IOException {
HttpClient client = new DefaultHttpClient();
HttpResponse httpResponse = client.execute(request);
try {
// ... other code ...
} finally {
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
entity.getContent().close();
}
}
return httpResponse;
}
此时您无法决定如何处理异常,因此最好的选择是让它滑到调用者。也许他知道如何处理它。
抛出异常会给调用者提供更多的可能性,而不仅仅是返回null
。
考虑您的其他问题:
但与此同时我不想将HttpResponse初始化为null。
这很好,因为您可以编写代码,以便变量始终保持适当的对象。请参阅上面的代码。
我在上面回答了这个问题。好方法是为方法添加这是为方法添加throws或添加初始化为null的httpResponse的try / catch块的好方法。
throws
子句。
我很兴奋为HttpResponse添加getter / setter,将其声明为成员变量。
不要那样做。 HttpResponse
是一个通常寿命很短的对象。它应该始终存储在局部变量中,并且当方法返回时,不需要保留它。这与您应该存储在类的字段中的HttpClient
不同,因此您可以在以后需要时添加连接池。
答案 1 :(得分:0)
我同意Roland的答案,即不试图处理该级别的例外情况。最好将它呈现给调用者,以便他们能够做出适当的反应。考虑响应可能失败的情况,调用者可以使用更改的请求重试。这与服务器超时或无响应的情况不同,您可能不想重新尝试请求。
如果您确实需要处理该级别的异常,请尝试以下代码;它将消除初始化为零的需要......
public HttpResponse executeRestClientServiceCall(final HttpUriRequest request)
{
final HttpClient client = new DefaultHttpClient();
try
{
return client.execute(request);
}
catch (final ClientProtocolException e)
{
}
catch (final IOException e)
{
}
return null;
}
这种简单的改变也消除了对变量的需要,并使方法的意图更加清晰。使用变量,初始化为null,然后在不同的逻辑分支中设置不同的唯一原因是,如果您尝试删除方法的多个断点。有时候只有一个方法的单一退出点是好的,但从它的外观来看,你并不是首先想要的,所以我建议的应该可以正常工作。