【问题标题】:Return statement with try/catch带有 try/catch 的返回语句
【发布时间】:2014-03-10 23:10:13
【问题描述】:

我知道对你们中的许多人来说这可能是一个愚蠢的问题,但我正在学习 android/java,但我仍然有一些不清楚的概念。

在这种情况下,我不确定在 try/catch 块中使用 return 语句的最佳方式是什么。

这就是我在需要使用它的地方声明我的方法的方式:

public JSONArray parseXmlResponse(String response) {

        JSONArray addressComp = null;
        JSONObject jsonObject = new JSONObject();

        try {
            jsonObject = new JSONObject(response);
            addressComp = jsonObject.getJSONArray("results").getJSONObject(0).getJSONArray("address_components");
        }catch (JSONException e) {
            e.printStackTrace();
        }
        return addressComp;
    }

据我所知,这里的方法总是返回“addressComp”,即使它为空。
但我看到其他人会以其他方式这样做:

public JSONArray parseXmlResponse(String response) {

        JSONArray addressComp = null;
        JSONObject jsonObject = new JSONObject();

        try {
            jsonObject = new JSONObject(response);
            addressComp = jsonObject.getJSONArray("results").getJSONObject(0).getJSONArray("address_components");
            return addressComp;
        }catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

但这让我有点困惑。
通过在此处设置return null 不会将值设置为始终返回为null,即使addressComp 具有实际值?

【问题讨论】:

  • 如果没有发生异常,则返回发生在try 块的末尾。此时返回addressComp,它不为空。
  • return null; 是无法访问的代码。
  • @Petter 所以,正如你所说,如果没有发生异常并且它通过 try 块,它会返回 try 块中的内容并跳过返回的 null 值
  • @ᴍarounᴍaroun 不,不是。如果 try 块中的语句之一抛出 JSONException,它将不会到达 return addressComp;,因此会在打印堆栈跟踪后到达 return null;
  • @blalasaadri 你是对的。

标签: java android return try-catch


【解决方案1】:

即使addressComp有一个真实值,设置返回null也不会将值设置为始终返回null?

不,一旦遇到第一个return 语句,它将return addressCompreturn null 行将永远不会被执行。只要确保在取该值的变量上检查 null 是否会导致问题。

编辑

JSONArray jArray = parseXmlResponse(someString);
if (jArray != null)
{
     //run some code
}
else
{
    //it's null so run some other code
}

【讨论】:

  • 好的,接下来应该设置另一个try/catch块来捕获变量取ta值的NULLPOINTEREXCEPTION,对吧?
  • 不一定是try/catch 块。让我用一个简短的例子来编辑
【解决方案2】:

这些方法基本上实现了相同的目标。第二种方式,只会到达return语句……

return addressComp;

...如果 try 块中它上面的所有内容都很好并且不会引发异常。一旦命中,该方法就完成了,不再执行任何代码,因此它不会达到 null 返回。

但是,如果在 try 块中出现问题,它将去 catch,打印堆栈跟踪,然后程序流将通过 try catch 块,并返回 null 值。请注意,一旦抛出异常,try 块中的其他任何内容都不会运行。

第二种方法更好一点,因为您至少可以报告问题。如果您使用第一种方式,您需要在继续之前检查返回的值是否为空。

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2021-12-25
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多