我是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)
答案 0 :(得分:7)
for (int a = 0; a < primefactors.size() + 1; a++)
{
if (primefactors.elementAt(a) == primefactors.elementAt(a+1))
{
count++;
}
超过primefactors
集合的大小。实际上是2。
更改为primefactors.size() - 1
以避免此错误。
答案 1 :(得分:2)
数组基于零,我想你已经知道了。您可能不知道的是,在Java中,List
也由数组支持。当你调用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中的camel case,因此您的函数名称应为getPrimeFactors(int number)
GlobalMembersMain
最有可能被命名为GlobalMember
,因为类本质上是单数的,我相信你添加了Main
来表示它是包含主函数的类。
在您的主要功能中,您可以这样做:
GlobalMember member = new GlobalMember();
member.getPrimeFactors(数);
答案 2 :(得分:0)
这就是问题所在:
for (int a = 0; a < primefactors.size() + 1; a++)
{
if (primefactors.elementAt(a) == primefactors.elementAt(a+1))
{
count++;
}
//...
对于集合中的最后一个元素, primefactors.elementAt(a+1)
将抛出异常(AIOB)。
答案 3 :(得分: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)
,但该程序将不会爆炸。
循环中还存在第二个问题,因为在比较期间将循环变量增加1:
if (primefactors.elementAt(a) == primefactors.elementAt(a+1)) {
// ...
}
然而,如果您将2作为参数传递给primefactors.elementAt(...)