Java 我可以在不嵌套try语句的情况下尝试多项操作吗?

Java 我可以在不嵌套try语句的情况下尝试多项操作吗?,java,exception-handling,try-catch,Java,Exception Handling,Try Catch,我的程序正在处理一些JSON数据。我希望随着时间的推移,程序能够真正稳定,JSON数据可以随着源代码的更新和改进而改变。这是从数据返回某些图像文件名的当前函数: @Override public String createImgName() { try { // data["image"]["full"] return getJSONData().getJSONObject("image").getString("full"); } catch(JSONExcepti

我的程序正在处理一些JSON数据。我希望随着时间的推移,程序能够真正稳定,JSON数据可以随着源代码的更新和改进而改变。这是从数据返回某些图像文件名的当前函数:

@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
ing多个操作直到一个操作成功,是否有语法?在我的例子中,
return
语句在成功时会中断程序,但情况并非总是如此。

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


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

更多信息:

例如:

@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抛出异常不同,您可以让它返回null,在其中,您将有一个很好的if-else语句流控制,所有语句都在try-catch中,如果发生了非常糟糕/异常的情况,抛出一个特定的异常,相应的catch语句将处理它

try-catch不是一个好的流控制的原因:异常抛出时代价高昂,因为即使不使用它也必须保留堆栈跟踪,这在快速和肮脏的编程中是好的,但在性能是关键的情况下则不行。这就是为什么只有在异常真正异常时才应该抛出异常的原因

像这样的东西会很好:

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
  }
}


您还可以在
try catch
中添加一个
finally
,以获取无论您的尝试是否成功都将始终执行的代码。这在关闭连接时很有用,或者根据需要返回true/false作为使用该方法的其他函数的状态代码

简言之,答案是否定的——在一件事成功之前,你不能尝试多件事。请注意,你正在使用
try-catch
作为“流量控制”。这几乎肯定不是你想要的,最佳实践建议避免。你也可以在捕获后/捕获之外进行第二次尝试。如果没有异常发生,代码将返回。有一些区别,但不清楚哪一个更好。当然,首先避免异常更好。@NathanielFord我理解你的意思,但JSON库在几乎所有操作上都抛出异常,这迫使我这样编写代码。我喜欢这个答案,因为你应该只在真正异常的情况下使用异常,而不是常规的逻辑控制。只是吹毛求疵,但是您可以删除其他代码,以使代码更清晰/干净。