我可以在不嵌套 try 语句的情况下尝试多项操作吗?
Can I try multiple things without nesting the try statements?
我的程序正在处理一些 JSON 数据。我希望程序随着时间的推移真正稳定,并且 JSON 数据可以随着其源的更新和改进而改变。这是 return 来自数据的一些图像文件名的当前函数:
@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
处理多个事情直到一个成功?在我的例子中,return
语句在成功时中断了程序,但情况可能并非总是如此。
我建议使用 if/else 块代替 try/catch 的(最佳实践)。但是对于 try/catch 你确实需要我建议使用面向铁路的编程来将它们保持在最低限度。
您可以使用 .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;
}
}
要回答张贴的问题,即如果您可以在多个事物上使用 try
而无需嵌套 try-catch
语句,则不会。
但是,您可以做的是,除了其中一个答案中发布的 if-else 之外,您还可以 捕获多个东西。
因此,您可能需要两种控件的组合:
不是让 getJSONData 抛出异常,你可以让它 return 为 null,在其中你将有一个很好的 if-else 语句的流程控制,全部在 try-catch 中,如果真的有什么东西bad/exceptional发生,抛出特定的异常,对应的catch语句会处理。
try-catches 不是一个很好的流程控制的原因: 抛出异常时代价高昂,因为即使不使用它也必须保留堆栈跟踪,这是在快速和肮脏的编程中很好,但在性能 key.That 的情况下却不行,这就是为什么 只有在异常 时才应该抛出异常。 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.
您还可以在 try-catch
中添加 finally
代码,无论您的尝试是否成功,代码都会始终执行。这在关闭连接时很有用,或者 return true/false 根据您的需要作为使用该方法的其他功能的状态代码。
我的程序正在处理一些 JSON 数据。我希望程序随着时间的推移真正稳定,并且 JSON 数据可以随着其源的更新和改进而改变。这是 return 来自数据的一些图像文件名的当前函数:
@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
处理多个事情直到一个成功?在我的例子中,return
语句在成功时中断了程序,但情况可能并非总是如此。
我建议使用 if/else 块代替 try/catch 的(最佳实践)。但是对于 try/catch 你确实需要我建议使用面向铁路的编程来将它们保持在最低限度。
您可以使用 .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;
}
}
要回答张贴的问题,即如果您可以在多个事物上使用 try
而无需嵌套 try-catch
语句,则不会。
但是,您可以做的是,除了其中一个答案中发布的 if-else 之外,您还可以 捕获多个东西。
因此,您可能需要两种控件的组合:
不是让 getJSONData 抛出异常,你可以让它 return 为 null,在其中你将有一个很好的 if-else 语句的流程控制,全部在 try-catch 中,如果真的有什么东西bad/exceptional发生,抛出特定的异常,对应的catch语句会处理。
try-catches 不是一个很好的流程控制的原因: 抛出异常时代价高昂,因为即使不使用它也必须保留堆栈跟踪,这是在快速和肮脏的编程中很好,但在性能 key.That 的情况下却不行,这就是为什么 只有在异常 时才应该抛出异常。 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.
您还可以在 try-catch
中添加 finally
代码,无论您的尝试是否成功,代码都会始终执行。这在关闭连接时很有用,或者 return true/false 根据您的需要作为使用该方法的其他功能的状态代码。