如何用双层for循环遍历二维数组输出姓名对且不捕获数组越界异常?
嘿,刚学Java就能想到用异常来解决问题已经很不错啦!不过用异常来控制程序流程确实不是最佳实践,咱们可以调整循环的逻辑,完全避免数组越界的情况,而且依然用双层for循环实现~
先说说你原来代码的问题:你的二维数组只有2行(索引0是名字,索引1是姓氏),但外层循环遍历了ladrones2.length(也就是2次),当循环到i=1的时候,i+1=2就超出了数组的索引范围(数组最大索引是1),所以才会抛出ArrayIndexOutOfBoundsException,你靠捕获这个异常来终止程序,虽然能得到正确结果,但逻辑上有点“投机取巧”。
下面给你几种更合理的实现方式:
方式一:限定外层循环只处理第一行
因为我们明确知道第一行是名字,第二行是姓氏,所以外层循环只需要运行一次(只处理索引0的行),内层循环遍历该行的每个元素,然后直接配对第二行的对应位置元素:
public static void robo2() { String[][] ladrones2 = { {"Phil", "Kim", "Phil", "Perry"}, {"Garcia", "Gimena", "Basinger", "Ornitorrinco"}}; // 外层循环只处理第一行(索引0),避免i+1越界 for (int i = 0; i < 1; i++) { // 内层循环遍历第一行的每个元素索引 for (int j = 0; j < ladrones2[i].length; j++) { System.out.println("name: " + ladrones2[i][j] + " " + ladrones2[i + 1][j]); } } }
方式二:通用化外层循环边界
如果以后你的数组可能有更多行(比如增加中间名),可以让外层循环只运行到倒数第二行,这样i+1永远不会超出数组的最大索引:
public static void robo2() { String[][] ladrones2 = { {"Phil", "Kim", "Phil", "Perry"}, {"Garcia", "Gimena", "Basinger", "Ornitorrinco"}}; // 外层循环只到倒数第二行,保证i+1不会越界 for (int i = 0; i < ladrones2.length - 1; i++) { for (int j = 0; j < ladrones2[i].length; j++) { System.out.println("name: " + ladrones2[i][j] + " " + ladrones2[i + 1][j]); } } }
方式三:按列遍历拼接(更通用)
如果想让代码适配更多行的情况(比如3行:名字、中间名、姓氏),可以改成按列遍历,内层循环遍历每行的元素进行拼接:
public static void robo2() { String[][] ladrones2 = { {"Phil", "Kim", "Phil", "Perry"}, {"Garcia", "Gimena", "Basinger", "Ornitorrinco"}}; // 取第一行的列数(假设所有行的列数一致) int columnCount = ladrones2[0].length; // 外层循环遍历每一列(每一列对应一个完整姓名) for (int j = 0; j < columnCount; j++) { StringBuilder fullName = new StringBuilder(); // 内层循环遍历当前列的所有行元素 for (int i = 0; i < ladrones2.length; i++) { if (i != 0) { fullName.append(" "); } fullName.append(ladrones2[i][j]); } System.out.println("name: " + fullName); } }
这几种方式的核心都是用数组的length属性或者明确的边界来控制循环范围,确保不会访问超出数组索引的位置,自然就不需要捕获异常啦。
内容的提问来源于stack exchange,提问作者Samuel Van Bladel
相关产品推荐
相关产品推荐

