Java 求和谜题,遇到我找不到的越界错误

Java sum puzzle, stuck with out of bounds error that I can't find

在尝试解决 java 中的编程难题时,我遇到了一些我不理解的错误,尽管我已经尝试编辑代码/缩小代码范围以尝试想办法。

我的整个程序在下面,你一贴就可以运行(主要方法是用我已经制作的方法中我想要的当前测试参数编写的)。拼图的描述写在class开始后的右边,但简而言之拼图就是做一个方法,有3个参数a,b,c,方法return s 这些 3 的总和,除非它们中的任何一个是整数 13 - 在这种情况下,这个 13 和右边的参数从总和中省略。

当我尝试 运行 我当前的测试时,它说在 if(x == 0 && x == 13) 行下有一个 ArrayIndexOutOfBoundsException: 3 错误,它是在 for 循环 for(int x=0; x<params.length; x++).[= 下找到的16=]

我不明白这个错误是怎么来的 - 我添加了使 x 成为数组内参数的计数器,并向其添加 1 和 2 以使元素位于右侧0. 我理解它 可能 在这里越界,但它在 if 语句下检查 x 是否为 13 和 0,这意味着它有仅在我检查第一个参数(在索引 0 处)时执行此操作。但由于某种原因,它仍然是越界的,就好像它正在 x>=1 处进行检查,其中 +1 和 +2 之后会将它发送到界外。

任何人都可以看到导致错误的原因吗?

注意:我解决这个问题的想法是将参数存储在数组中,检查它们是否为 13,如果是使该数字为 0 并将其右侧存储的为 0,则 return 的总和之后的数组。

public class Logic2Q3 {
    /*
     * Given 3 int values, a b c, return their sum. However, if one of the values is 13 
     * then it does not count towards the sum and values to its right do not count. 
     * So for example, if b is 13, then both b and c do not count.
     * 
     * e.g.:
     * luckySum(1, 2, 3) -> 6
     * luckySum(1, 2, 13) -> 3
     * luckySum(1, 13, 3) -> 1
     * 
     */

    public int luckySum(int a, int b, int c) {

        int[] params = new int[3]; // array to store params
        int sum = 0; // for storing the final sum 

        // store params for checking here
        params[0] = a;
        params[1] = b;
        params[2] = c;

        // check the array of parameters and alter them according to specs
        for(int x=0; x<params.length; x++) {
            // in the case 13 is found 
            if(params[x] == 13) {

                // case that it's the first element (a) and is also the 13
                if(x == 0 && x == 13)
                    // make both elements on the right 0 to not add to the sum
                    params[x] = 0; 
                    params[x+1] = 0;                        
                    params[x+2] = 0;  

                // case that it's the second element (b)
                if(x == 1 && x == 13)
                    // make only the element on the right 0
                    params[x] = 0; 
                    params[x+1] = 0;

            }
        }

        // after the array is altered to omit a, b, and c being 13 or to the right of 13, sum everything
        for(int x=0; x<params.length; x++) {
            // += must be used on initialised instance variable only 
            sum += params[x]; 
        }


        return sum; 

    }

    public static void main(String[] args) {

        Logic2Q3 test = new Logic2Q3(); 

        System.out.println(test.luckySum(3,13,7));



    }

}

for 循环第二次运行时,如果 param[x] 等于 13 或任何晚于 0 的时间,总是执行行 params[x+2] = 0!请阅读 a coding guideline for java 并且永远不要在没有使用 {//if statement stuff} 设置正确范围的情况下使用 if 语句 !!!

阅读指南后,您应该能够解决您的问题!

编辑:此外,那些 if 语句永远不可能为真! x 不能同时等于 0 和 13

虽然您的代码可能会创建一个 IndexOutOfBoundExeption,因为您确实访问了 x+1x+2 处的值,但还有其他错误。缺少括号并且 if 条件永远不会为真,因为您检查一个值是否等于两个值(不合逻辑吗?)。

总而言之,我最好的猜测是,您正在使这个完整的 luckySum "puzzle" 变得有点复杂,因为您真正需要的只是一个循环和一个变量总和。找到一个值后,您可以简单地 break 退出循环并 return 总和。这是您所做操作的更简化版本。

public static void main(String[] args) {
    System.out.println(luckySum(1, 2, 3));
    System.out.println(luckySum(1, 2, 13));
    System.out.println(luckySum(1, 13, 3));
}
/**
 * Given 3 int values, a b c, return their sum. However, if one of the values is 13 
 * then it does not count towards the sum and values to its right do not count. 
 * So for example, if b is 13, then both b and c do not count.
 * 
 * e.g.:
 * luckySum(1, 2, 3) -> 6
 * luckySum(1, 2, 13) -> 3
 * luckySum(1, 13, 3) -> 1
 * 
 */
public static int luckySum(int... values) {
    // Using varargs for dynamic amound of values
    // Sum variable
    int sum = 0;
    // loop over all values
    for(int x=0; x<values.length; x++) {
        // in the case 13 is found break out of the loop
        if(values[x] == 13) {
            break;
            // As a second option you could just return sum here
            // return sum;
        }
        // add value to the sum
        sum += values[x];
    }
    return sum;
}

O/P

6
3
1