于道 2021-07-12 00:17 采纳率: 100%
浏览 577
已采纳

Java关于if语句中有多个条件需要判断,各个条件间的先后顺序有要求吗

今天学习回形数,在网上看了别人的代码后试着按自己的理解敲了一遍

package exercise;
import java.util.Scanner;

/**
 * @author lzy
 * 数组算法
 * 回形数,也称回形矩阵
 */
public class RoundMatrix {
    /**
     * 定义常量代表含义
     * 初始向右,设置RIGHT = 1
     */
    private static final int RIGHT = 1;
    private static final int DOWN = 2;
    private static final int LEFT = 3;
    private static final int UP = 4;

    public static void main(String[] args) {
        //1.创建数组
        //根据键盘输入num值决定回型矩阵的行数列数
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int num = scanner.nextInt();
        int[][] roundMatrix = new int[num][num];
        //表示该矩阵元素的总数目
        int count = num * num;

        //2.赋值
        //定义横纵坐标,方向,循环次数计数器
        int xAis = 0;
        int yAis = 0;
        int direction = RIGHT;
        int recycleNumber;

        for (recycleNumber = 1; recycleNumber <= count; recycleNumber ++){
            //方向向右时的处理
            switch (direction) {
                case RIGHT:
                    if (roundMatrix[xAis][yAis] == 0 && yAis < num) {
                        roundMatrix[xAis][yAis] = recycleNumber;
                        yAis ++;
                    } else {
                        direction = DOWN;
                        xAis++;
                        yAis--;
                        //进入else的recycleNumber需减1,保证下次循环时的值正确
                        recycleNumber--;
                    }
                    break;
                //方向向下时的处理
                case DOWN:
                    if (roundMatrix[xAis][yAis] == 0 && xAis < num) {
                        roundMatrix[xAis][yAis] = recycleNumber;
                        xAis ++;
                    } else {
                        direction = LEFT;
                        xAis--;
                        yAis--;
                        recycleNumber--;
                    }
                    break;
                //方向向左时的处理
                case LEFT:
                    if (roundMatrix[xAis][yAis] == 0 && yAis >= 0) {
                        roundMatrix[xAis][yAis] = recycleNumber;
                        yAis --;
                    } else {
                        direction = UP;
                        xAis--;
                        yAis++;
                        recycleNumber--;
                    }
                    break;
                //向上
                case UP:
                    if (roundMatrix[xAis][yAis] == 0 && xAis >= 0) {
                        roundMatrix[xAis][yAis] = recycleNumber;
                        xAis --;
                    } else {
                        direction = RIGHT;
                        xAis++;
                        yAis++;
                        recycleNumber--;
                    }
                    break;
                default:
            }

        }
        //3.遍历
        for (int[] matrix : roundMatrix) {
            for (int i : matrix) {
                System.out.print(i + " ");
            }
            System.out.println();
        }
    }
}

写完后运行,但是却一直报错,显示数组越界异常,不明白为什么

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at exercise.RoundMatrix.main(RoundMatrix.java:40)

最后把每条case语句中第一个if语句中 && 前后两个条件的顺序替换了才运行成功,虽然没再报错了,但一直不明白为什么颠倒了顺序后就会数组越界

case RIGHT:
                    if (yAis < num && roundMatrix[xAis][yAis] == 0)
  • 写回答

4条回答 默认 最新

  • CSDN专家-sinJack 2021-07-12 00:46
    关注

    判断先后顺序肯定有关系。&&的意思是满足条件一才执行条件二,如果条件1不满足则不会执行条件2。拿你的问题来说,只有索引位置满足条件的时候,才会去进一步比较索引位置对应的值。否则,先取值的话,可能你的索引位置不满足要求,被用来取值了,导致数组越界异常。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已采纳回答 7月12日
  • 创建了问题 7月12日

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题