我的程序正在处理一些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
语句在成功时打破了程序,但可能并非总是如此。
答案 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你需要我建议使用面向铁路的编程来将它们降到最低。
答案 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作为使用该方法的其他函数的状态代码。