2014-10-06 123 views
1

这个问题正在让我有点疯狂,所以希望你们中的一个好人可以指出我在正确的方向。我正在尝试准备将从客户端传递到服务器的JSONObject。以下是解决问题的方法:JSONObject放置方法在try块导致错误,但catch块没有执行

private JSONObject getJsonParam(int id) 
{ 
    JSONObject param = new JSONObject(); 
    try 
    { 
     param.put("functionCode", 50); 
     param.put("id", id); 
     return param; 
    } 
    catch (JSONException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (Throwable e) 
    { 
     e.printStackTrace(); 
    } 
    return null; 
} 

我仔细追踪了调试模式下的代码。在实际的方法中,我把更多的参数放在JSONObject中,并且一直很好,直到我尝试插入id的最后一个param.put()方法。当这是当前的执行线时,我可以将param变量可视化,并且所有外观都很好。然后当我执行step函数来执行最后一个param.put调用时,它跳转到返回null语句。我已经在两个catch块中放置了断点,并且看起来没有被执行。 (我添加了第二个catch块,以确保没有其他throwable导致问题)。

任何想法会导致这种奇怪的行为?我甚至尝试重新安排看跌期权的顺序。它对于特定的put调用没有任何问题,而只是return语句之前的最后一个。

我正在从事Android/Java。

+0

你得到了什么错误,pl发布你的堆栈跟踪 – 2014-10-06 16:02:45

+1

这可能是IDE的一个问题。通过在函数外部放置一个断点并检查它返回的内容,确保你的结果是JSONObject而不是null。 – 2014-10-06 16:06:43

+0

@PedroOliveira这确实是IDE的一个问题。当我按照你的建议做时,我发现该函数正在返回正确的JSONObject!谢谢!我想这意味着我浪费了很多时间来解决一个实际上不成问题的问题......哈哈 – user3478532 2014-10-06 16:16:42

回答

1

代码不会导致错误 - 您只是被编译器优化了两个返回语句以使用相同的代码这一事实所困扰。

在每种情况下,返回值都是某个“当前值”,在一种情况下,当前值来自param变量,而另一种情况下则为空。由于编译器仅使用代码的一个副本,因此调试器无法正确地确定正在执行哪个实际的源代码行。