2012-11-16 40 views
0

我是Java新手,我的第一個任務是實現「for」循環。我用C++編寫了這個程序,它用Java編譯,但是在運行時出錯。誰能告訴我什麼是錯的?java.lang.ArrayIndexOutOfBoundsException:2> = 2

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

不使用矢量,除非你確實需要同步。使用列表/數組列表 – Woot4Moo

回答

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

是超過primefactors集合的大小。實際上是2。

更改爲primefactors.size() - 1以避免此錯誤。

+2

OP也不應該使用Vector等。 – Woot4Moo

0

這就是問題的所在:

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

//... 

primefactors.elementAt(a+1)爲您收集將拋出異常(AIOB)中最後一個元素。

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中的駱駝情況下讓你的函數名應該是getPrimeFactors(int number)

GlobalMembersMain

應該最有可能被命名GlobalMember爲類在本質上奇異,我相信你添加Main,表示它是類它具有主要功能。

在你的主要功能,你這樣做:

GlobalMember成員=新GlobalMember();
member.getPrimeFactors(number);

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(...)

你的程序將失敗
相關問題