Java 我可以在不嵌套try语句的情况下尝试多项操作吗?
我的程序正在处理一些JSON数据。我希望随着时间的推移,程序能够真正稳定,JSON数据可以随着源代码的更新和改进而改变。这是从数据返回某些图像文件名的当前函数: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
@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库在几乎所有操作上都抛出异常,这迫使我这样编写代码。我喜欢这个答案,因为你应该只在真正异常的情况下使用异常,而不是常规的逻辑控制。只是吹毛求疵,但是您可以删除其他代码,以使代码更清晰/干净。