我可以在不嵌套try语句的情况下尝试多种方法吗?

时间:2015-05-01 18:01:57

标签: java exception-handling try-catch

我的程序正在处理一些JSON数据。我希望程序在一段时间内保持稳定,JSON数据可以随着源的更新和改进而改变。这是从数据中返回一些图像文件名的当前函数:

X := p/(p+q)*C' = 1/(1+25)*4*5*26 = 1/26*4*5*26 = 4*5 = 20
Y := q/(p+q)*C' = 25/(1+25)*4*5*26 = 25/26*4*5*26 = 25*4*5 = 500.

还有一些我可以@Override public String createImgName() { try { // data["image"]["full"] return getJSONData().getJSONObject("image").getString("full"); } catch(JSONException e) { try { // data["id"] + ".png" return getJSONData().getJSONObject("id")+".png"; } catch(JSONException e2) { return null; } } } 获取图像名称的内容。但该计划会变得非常难看。

在成功之前,是否存在try多个事物的语法?在我的情况下,try语句在成功时打破了程序,但可能并非总是如此。

3 个答案:

答案 0 :(得分:8)

您可以使用.has()或.isNull()方法检查可能的键,而不是使用多个try语句。

更多信息: http://www.json.org/javadoc/org/json/JSONObject.html#has(java.lang.String) http://www.json.org/javadoc/org/json/JSONObject.html#isNull(java.lang.String)

例如:

@Override
public String createImgName() {
  try {
    JSONObject data = getJSONData();
    // data["image"]["full"]
    if (data.has("image")) {
      return data.getJSONObject("image").getString("full");
    } else if (data.has("id")) {
      return data.getJSONObject("id")+".png";
    }
  }
  catch(JSONException e) {
    return null;
  }
}

答案 1 :(得分:1)

我建议使用if / else块代替(最佳实践)try / catch。但是对于try / catch你需要我建议使用面向铁路的编程来将它们降到最低。

http://fsharpforfunandprofit.com/posts/recipe-part2/

答案 2 :(得分:1)

要回答发布的问题,即如果您可以在不嵌套try语句的情况下对多个事项使用try-catch,则为。

然而,你可以做的是,除了在其中一个答案中张贴的if-else外,你可以捕获多个东西

所以也许你可能想要两个控件的组合:

你可以让它返回null,而不是让getJSONData抛出异常,你可以在if-else语句中有一个很好的流控制,所有这些都在try-catch中,如果发生了非常糟糕/异常的事情,抛出一个特定的异常,相应的catch语句将处理它。

try-catches不是一个好的流量控制的原因:抛出异常是昂贵的,因为即使不使用它也必须保持堆栈跟踪,这在快速和脏的情况下很好编程,但不是在性能是关键的情况下。这就是为什么异常只有在真正异常的情况下才会抛出See this opinion based Q&A on true-false vs exceptions, where my elaboration on that issue is located as well.

这样的事情会很好:

public string imgName()
{ 
  try
  {
    JSONdata a = getJSONmethodA();  
    if(a == null) 
        a = getJSONmethodB(); 
    if(a == null) 
        a = getJSONmehtodC();
    return a;
  }
  catch(Exception unresolvableExceptionA)
  { 
       //error handling 
  }
  catch(Exception verybadExceptionB)
  {
       //special error handling for exception B
  }

}

Here's a related SO question on this multiple catch structure.

您还可以在finally中为try-catch添加country = c.Details != null ? c.Details.Country : "", // or null or another // appropriate default value 代码,无论您的尝试是否成功,代码都会始终执行。这在关闭连接时很有用,或者根据您的需要返回true / false作为使用该方法的其他函数的状态代码。