我是JSONArray。我想将其解析为JSONObject。所以Loop和try-catch是必须的 愚蠢的问题是:我应该在TRY中使用FOR循环还是反向?这真的很重要或两者都一样吗? 请告诉我最佳实践(如果两者不相同)。
try {
for(i=0; i<jsonArray.length(); i++){
jsonObject = jsonArray.getJSONObject(i);
//do something
}
} catch (JSONException e) {
e.printStackTrace();
}
for(i=0; i<jsonArray.length(); i++){
try {
jsonObject = jsonArray.getJSONObject(i);
//do something
} catch (JSONException e) {
e.printStackTrace();
}
}
哪一个更好?
答案 0 :(得分:5)
这取决于您对数据完整性的认真态度。
第一个示例将运行循环,直到发生异常,一旦执行,将调用catch块并且循环将不再运行。
但是第二个例子将进入try块并尝试执行代码,如果有异常,则调用catch块并排除异常。然而,循环不会结束,下一次迭代将立即运行。
这是一个例子。我们会考虑当i = 4
时会发生一些异常try {
for(i=0; i<10; i++){
System.out.println("" + i);
}
} catch (Exception e) {
e.printStackTrace();
}
输出 -
0
1
2
3
Exception
并且
for(i=0; i<10; i++){
try {
System.out.println("" + i);
} catch (Exception e) {
e.printStackTrace();
}
}
输出
0
1
2
3
Exception
5
6
7
8
9
答案 1 :(得分:2)
TL,DR:这一切都归结为您的目的以及如何使用它。
假设您有一个要解析和显示/使用的Object列表,比如说,
[{"name":"Apple"},{"name":"Banana"},{"name":"Mango"}]
如果出现一个数据错误,如果您需要,只使用正确的一个并且不正确的一个,请在循环内使用 TRY 。
但如果您不想使用任何内容并只处理整个异常,请在TRY 中使用 FOR循环。
例如,如果您收到以下数据:
[{"name":"Apple"},{"name":"Banana},{"name":"Mango"}] // notice the missing " after Banana
如果循环内 TRY ,则只会显示
[{"name":"Apple"},{"name":"Mango"}]
如果在TRY 中 FOR循环,它将不会显示任何内容。
答案 2 :(得分:1)
这取决于场景。如果在循环的任何迭代中都有机会获得异常,那么我认为在循环中尝试更好。因为,在捕获异常后循环将继续。但是,尝试是在循环的一边,然后循环将破坏。我肯定会在循环中尝试,因为它更优化。
答案 3 :(得分:1)
实际上取决于您的需求(以及如何将这些对象用于代码的其余部分)。如果您在循环中编写 尝试 阻止,则循环将继续所有异常。如果您在 尝试 阻止内部运行循环,那么循环将中断以获取任何异常并将转到您的捕获块。
我们什么时候写继续,什么时候在循环中写 break ?这取决于我们的需求,对吧?这就是这种情况。希望,这会有所帮助。
答案 4 :(得分:0)
根据情况可能会有所不同,但我建议在for循环中使用循环,因为你的代码在第3次迭代中发现了任何异常,然后在第4次迭代中结束迭代将是安全的。
最佳做法是,try catch应该只涵盖需要的代码。
答案 5 :(得分:0)
在代码部分中使用try catch总是标准的做法,可能会发生异常。只有一个地方可能发生异常,而且它在for循环中。所以,#34; TRY内循环&#34;是答案。
答案 6 :(得分:0)
我认为你已经得到了答案,可能会有所不同,但我认为这种做法已经足够好了:
try {
JSONArray jsonArray = new JSONArray(jsonString);
int count = jsonArray.length();
for(int i=0 ; i< count; i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
System.out.println("jsonObject " + i + ": " + jsonObject);
}
} catch (JSONException e) {
e.printStackTrace();
}
或者你可以使用,做 - 抓住