gpt4 book ai didi

java - 正确使用Java异常

转载 作者:行者123 更新时间:2023-12-01 15:40:52 27 4
gpt4 key购买 nike

我有几个关于 Java 中异常的最佳使用的问题。

考虑下面的代码:

private String doHttpGetRequest(String url) throws IOException {
...
}

private Photo processJson(String json) throws JSON Exception{
...
}

private Photo getPhoto() throws IOException, JSON Exception {
String url = "http://...";
String response = doHttpGetRequest(url);
Photo photo = processJson(response);
photo.downloadImage();
return photo;
}

public static void main(String args[]) {
Photo p = null;
try {
p = getPhoto();
} catch( JSONException j ) {
// Re-try a few times, then display user alert
} catch( IOException e ) {
// Re-try a few times, then display user alert
}

if( p!=null)
// now display photo
}

此代码适用于连接可能不太可靠的 Android 应用程序,因此我想重试 getPhoto() 方法几次,看看它是否有效,然后失败并提醒用户。

我的问题:

  1. 我正在 doHttpGetRequest() 中打开一个 InputStream,并且该方法抛出 IOException。如果输入流抛出异常,如何关闭它?如果方法中没有允许我关闭资源的finally block ,我会很困惑。

  2. 在 main() 中,我只关心 getPhoto() 是否有效。我是否最好用 try/catch block 包围 getPhoto() 内的语句并捕获 JSONException,并在捕获时抛出一个新的 IOException?这将导致只需在 main() 中捕获一种异常,从而使代码更简单并且没有重复的功能。

  3. 如果 p.getPhoto() 引发异常,我想重试(可能两次),然后在失败时显示用户警报。是否有通用的编程结构来执行此操作?

最佳答案

  1. doHttpGetRequest() 应该负责关闭输入流。那里的finally-block适合关闭(为什么不想要finally block ?)。

  2. 是否必须将任何异常传递给 main 方法。您可以用 try{} 包围 doHttpGetRequest(url) ,并用另一个包围 processJson (我怀疑这个不会从重试中受益)。这将使 main() 方法更清晰。

  3. 如果您接受我对 2. 的建议,您可以像这样重试:

    String response = null;
    for (int i = 0; i < RETRY_COUNT && response == null; i++){
    try {
    response = doHttpGetRequest(url);
    } catch (IOException e){
    // Possibly log the error here
    }
    }
    if (response == null) return null;

编辑:错误修复

关于java - 正确使用Java异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8048779/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com