java.lang.ArrayIndexOutOfBoundsException:2>;=2.

java.lang.ArrayIndexOutOfBoundsException:2>;=2.,java,Java,我是Java新手,我的第一个任务是实现一个“for”循环。我用C++编写了这个程序,用java编译,但是运行时出错。谁能告诉我怎么了 import java.util.Scanner; import java.util.Vector; public class GlobalMembersMain { public static Vector<Integer> get_prime_factors(int number) { Vector<In

我是Java新手,我的第一个任务是实现一个“for”循环。我用C++编写了这个程序,用java编译,但是运行时出错。谁能告诉我怎么了

import java.util.Scanner;
import java.util.Vector;

public class GlobalMembersMain
{

    public static Vector<Integer> get_prime_factors(int number)
    {

        Vector<Integer> primefactors = new Vector<Integer>();
        for (int j = 2; j <= number; j++)
        {
            if (number % j == 0)
            {
                primefactors.add(j);
                number = number / j;
                j = 1;
            }
        }
        return primefactors;
    }

    public static void main(String[] args)
    {
        int number;
        int count = 1;
        System.out.print("Enter integer to analyse:");
        System.out.print("\n");
        Scanner scan = new Scanner(System.in);
        number = scan.nextInt();
        Vector<Integer> primefactors = new Vector<Integer>();
        primefactors = get_prime_factors(number);
        System.out.print("Prime factors are ");
        for (int a = 0; a < primefactors.size() + 1; a++)
        {
            if (primefactors.elementAt(a) == primefactors.elementAt(a+1))
            {
                count++;
            }
            else
            {
                System.out.print(primefactors.elementAt(a));
                System.out.print(" (");
                System.out.print(count);
                System.out.print(") ");
                count = 1;
            }
        }
        System.out.print("\n");
    }
}
for(int a=0;a
超出了
primefactors
集合的大小。实际上是2


更改为
primefactors.size()-1以避免此错误。

这就是问题所在:

for (int a = 0; a < primefactors.size() + 1; a++)
    {
        if (primefactors.elementAt(a) == primefactors.elementAt(a+1))
        {
            count++;
       }

//...
for(int a=0;a

primefactors.elementAt(a+1)
对于集合中的最后一个元素将抛出异常(AIOB)。

数组是基于零的,我想您已经知道了。您可能不知道的是,在Java中,
列表也是由数组支持的。当您调用
primefactors.size()时+1
您得到的比您可能想要的多一个。例如,如果pf的大小为1,则您的循环将执行以下操作:

pf.get(0);  //returns the only value in the list  
pf.get(1); // element doesn't exist
现在,另一件事是您不想使用
Vector
,通常在Java中。它是一个同步的集合。您需要的是List/ArrayList

其他代码问题

public static Vector<Integer> get_prime_factors(int number)
公共静态向量获取素数因子(整数)
这不需要是静态的。Java中的命名约定也是驼峰式的,所以函数名应该是
getPrimeFactors(int number)

GlobalMembersMain

最有可能被命名为
GlobalMember
,因为类在本质上是单数的,我相信您添加了
Main
,以表明它是持有主函数的类

在您的主要功能中,您将执行以下操作:

GlobalMember成员=新的GlobalMember();

member.getPrimeFactors(number);

请记住,Java中的数组、列表和向量是基于零的。在您的例子中,
primefactors
向量将由两个元素组成,分别位于索引0和1处

您面临的问题是试图访问不存在的元素
primefactors.elementAt(2)

一个问题是循环中的中断条件:

for (int a = 0; a < primefactors.size() + 1; a++) { 
    // ... 
}

同样,如果将2作为参数传递给
primefactors,程序将失败。elementAt(…)

除非确实需要同步,否则不要使用Vector。使用List/ArrayListOP也不应该使用Vector。
public static Vector<Integer> get_prime_factors(int number)
for (int a = 0; a < primefactors.size() + 1; a++) { 
    // ... 
}
if (primefactors.elementAt(a) == primefactors.elementAt(a+1)) { 
    // ... 
}