我在我的java方法中找不到返回素数数组的错误。

时间:2015-02-16 16:08:45

标签: java debugging primes

它仅使用素数来检查其他数字是否也是素数

static public int[] primeGen(int a){

    int[] series={2};

    if (a==1 || a==2 || a<=0){
        return series;
    }   

这是发生错误的地方

    else{

        boolean Prime = false;

        for (int i = 3; i<=a; i++){

            boolean[] state = {};

            for (int j = 0; !(state[state.length-1]) && (j<series.length); j++){
                state = Arrays.copyOf(state, state.length +1);
                state[state.length -1] = i % series[j] ==0;
            }

            for (int k = 0; (Prime) && (k<state.length); k++){
                Prime = !(state[k]);
            }

            if (Prime){
                series = Arrays.copyOf(series, series.length +1);
                series[series.length -1] = i;
            }
        }
        return series;
    }
} 

很抱歉,如果我犯了一个菜鸟错误,因为我已经学习了3天的Java

3 个答案:

答案 0 :(得分:2)

您的state数组初始化为空数组,因此!(state[state.length-1])会尝试访问数组的无效索引(-1)。

答案 1 :(得分:0)

这一行

for (int k = 0; (Prime) && (k<state.length); k++){

表示只有Prime为真时才会执行循环。但是,您已将Prime初始化为false,并且仅在循环内将其设置为true。

看起来您正在使用Arrays.copyOf来增加输出数组的大小。您只需使用Vector.add(),JVM就可以处理所需的任何调整大小。

答案 2 :(得分:0)

现在工作正常!

我的错误是我不知道for循环根本不会启动如果中间的语句为(int j = 0; (Prime)&amp;&amp;(j&lt;)< / strong>; j ++){}不是真的。我认为这只会在每次重复结束时进行检查。无论如何,如果没有你们指出这些陈述没有加起来,我就不会意识到这一点,所以非常感谢!

        boolean Prime = false;

        for (int i = 3; i<=a; i++){

            boolean[] state = {};

            for (int j = 0; (j<series.length); j++){
                state = Arrays.copyOf(state, state.length +1);
                state[state.length -1] = i % series[j] == 0;
       //This is where I added my statement that breaks the loop
                if (!(state[state.length-1]==false&&j<series.length)){break;}
            }

            for (int k = 0; (k<state.length); k++){
                Prime = !(state[k]);
       //As well as here
                if (!(Prime==true&&k<state.length)){break;}
            }

            if (Prime == true){
                series = Arrays.copyOf(series, series.length +1);
                series[series.length -1] = i;
            }
        }
        return series;
    }
}