0

我是 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");
    }
}

输出:

Enter integer to analyse:
10
Prime factors are 2 (1) Exception in thread "main" java.lang.ArrayIndexOutOfBoun
dsException: 2 >= 2
        at java.util.Vector.elementAt(Unknown Source)
        at GlobalMembersMain.main(GlobalMembersMain.java:36)
4

4 回答 4

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

超出primefactors集合的大小。2,事实上。

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

于 2012-11-16T20:32:51.270 回答
2

数组是从零开始的,我想你已经知道了。您可能不知道的是,在 Java 中 aList也由数组支持。当你调用时,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 成员 = new GlobalMember();
member.getPrimeFactors(number);

于 2012-11-16T20:40:09.560 回答
0

这就是问题所在:

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

//...

primefactors.elementAt(a+1)集合中的最后一个元素将引发异常 (AIOB)。

于 2012-11-16T20:35:51.580 回答
0

请记住,Java 中的数组、列表和向量是从零开始的。在您的情况下,primefactors向量将包含两个元素,分别位于索引 0 和 1。

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

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

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

第一次a为0,第二次1都可以。但是,循环不会第三次中断,因为a将等于 2,即小于primefactors.size() + 1。因此,将有一个primefactors.elementAt(2)不存在的调用,程序将崩溃。

循环内部还有第二个问题,因为您在比较期间将循环变量加一:

if (primefactors.elementAt(a) == primefactors.elementAt(a+1)) { 
    // ... 
}

同样,如果您将 2 作为参数传递给primefactors.elementAt(...)

于 2012-11-16T21:32:16.777 回答