如何在For循环中实现多Try-Catch块?解决二维数组匹配异常
解决思路与修正代码
核心问题分析
你当前的代码存在三个关键问题:
continue的错误使用:catch块里的continue会直接跳转到下一个j的循环,导致当前元素的其他相邻方向(比如触发i+1异常后,i-1、j-1等方向)根本没机会检查。- 提前返回false:内层循环里检查完一个元素的四个方向后直接
return false,会导致只要第一个元素没匹配,就直接终止整个流程,完全没遍历后续元素。 - 用异常处理控制逻辑:异常应处理意外情况,而非正常的边界判断,这样既低效又容易出错。
修正方案:先做索引合法性判断,再比较值
直接在访问相邻元素前,判断索引是否在0 <= 索引 < b.size()的范围内,从根源上避免越界异常,同时保证当前元素的所有方向都能被检查到。
修正后的代码
for (int i = 0; i < b.size(); i++) { for (int j = 0; j < b.size(); j++) { int currentValue = b.tile(i, j).value(); // 检查下方元素(i+1,j) if (i + 1 < b.size()) { if (currentValue == b.tile(i + 1, j).value()) { return true; } } // 检查上方元素(i-1,j) if (i - 1 >= 0) { if (currentValue == b.tile(i - 1, j).value()) { return true; } } // 检查左方元素(i,j-1) if (j - 1 >= 0) { if (currentValue == b.tile(i, j - 1).value()) { return true; } } // 检查右方元素(i,j+1) if (j + 1 < b.size()) { if (currentValue == b.tile(i, j + 1).value()) { return true; } } } } // 所有元素都检查完毕,没有找到匹配的相邻元素 return false;
关键优化点
- 移除try-catch:用
if判断索引合法性替代,避免异常带来的性能损耗和流程中断。 - 保留完整检查:每个元素的四个方向都会被逐一检查,不会因为某个方向越界就跳过其他方向。
- 修正返回逻辑:只有遍历完所有元素都没找到匹配,才返回false;只要找到任意一个匹配,立即返回true,保证效率。
内容的提问来源于stack exchange,提问作者Tim Swen
相关产品推荐
相关产品推荐

