2013-08-27 29 views
-1

我對這個異常有很大的麻煩。我是新手到Java編程(和編程以及),所以..爲什麼,當第二類返回兩個數組異常出現?另外,當只有一個數組返回時(f.e「返回jakob;」),一切正常。 第一類:如何修復「ArrayIndexOutOfBoundsException」?

package mainpackage; 

public class GraWojna { 
int[] jakob = new int[24]; 
int[] gracz = new int[24]; 
public void Wojna() { 

    System.out.println("tasowanie kart..."); 
    // kart w talii jest 48, bo 4* 12.. true? 
    WojnaTasowanie tas = new WojnaTasowanie(); 

    tas.Tasowanie(jakob, gracz); 
    int licznik = 0; 
    while (licznik<23) { 
     System.out.println("jakob:" + jakob[licznik]); 
     licznik++; 
    } 


} 

} 

二等:

package mainpackage; 

import java.util.Random; 


public class WojnaTasowanie { 


int[] Tasowanie (int jakob[], int gracz[]) { 
    int jakb[] = new int[23]; 
    int grcz[] = new int[23]; 
    Random generator = new Random(); 
    int licznik = 0; 
    int[] Pula = new int[11]; 

    while (licznik<11){ 

     Pula[licznik] = 4; 
     licznik++; 
    } 
    licznik = 0; 

     int passa = 0; 
     int passb = 0; 
    while (licznik<22) { 

     passa = 5; 
     passb = 5; 
     System.out.println("step ----"); 

     while (passa<8){ 
     int bekaxd = generator.nextInt(11); 


     if (Pula[bekaxd]>0) { 
      Pula[bekaxd]--; 
      passa = 15; 
      jakob[licznik] = bekaxd; 
     } 



     while (passb<8){ 
      bekaxd = generator.nextInt(11); 
      gracz[licznik] = bekaxd; 
      System.out.println("licznik:" + licznik + "gracz: " + gracz[licznik] + "pula" + Pula[gracz[licznik]]); 
      if (Pula[gracz[licznik]]>0) { 
       Pula[gracz[licznik]]--; 
       passb = 15; 
      } 

     } 
     licznik++; 

     } 


    } 

    return Tasowanie(jakob, gracz); 

} 

} 

堆棧跟蹤:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 25 
at mainpackage.WojnaTasowanie.Tasowanie(WojnaTasowanie.java:51) 
at mainpackage.WojnaTasowanie.Tasowanie(WojnaTasowanie.java:76) 
at mainpackage.WojnaTasowanie.Tasowanie(WojnaTasowanie.java:76) 
at mainpackage.GraWojna.Wojna(GraWojna.java:12) 
at mainpackage.Main.main(Main.java:16) 

預先感謝您!

+6

你需要發佈你的堆棧跟蹤... – redFIVE

+1

有52張牌在甲板上,順便說一句。每種顏色都有13張牌。 – abc

+0

好的,完成了,對不起,我從來沒有機會在這裏提問。科斯泰克 - 事實上,我非常專注於「uaa,我在寫我的第一個節目!11」,我犯了這個非常愚蠢的錯誤。 –

回答

0

你有licznik ++;在錯誤的循環中, 將它向下移動2行並退出內部循環。

while (passb<8){ 
      bekaxd = generator.nextInt(11); 
      gracz[licznik] = bekaxd; 
      System.out.println("licznik:" + licznik + "gracz: " + gracz[licznik] + "pula" + Pula[gracz[licznik]]); 
      if (Pula[gracz[licznik]]>0) { 
       Pula[gracz[licznik]]--; 
       passb = 15; 
      } 

     } 


     } 
     licznik++; 
+0

這將解決你的錯誤,ArrayoutofIndexBoundaryException,但它會沿着這條線生成新的,主要是一個無限循環。我想你必須注意你正在使用的變量,是licznik ++正確嗎?你不應該改變passb嗎?也許你打算寫密碼而不是liczink ++。我不明白你的程序的邏輯,你將不得不知道:) – azzurroverde

+0

我剛剛注意到,但沒有幫助 –

+0

有兩個循環條件passb <8和passa <8,你離開只有當你分配passb = 15或passa = 15時,循環。如果普拉[gracz [licznik]]> 0或者普拉[bekaxd]> 0但是它從不是,至少不會按照我的跑步來發生。 – azzurroverde

0

IndexOutOfBoundsException occours當您嘗試訪問不存在數組中的位置:

EG。

int[] a = {7,12,5} 

int ac = a[3] //Here index out of Exception 

他們你必須找到你試圖訪問一個無效位置的地方。

0

的普拉陣列具有11個元素,但索引均爲0。10.隨機發生器被使INT 11,所以在這裏使用時(或任何地方的隨機數被用作索引):

if (Pula[bekaxd]>0) { 

它引發錯誤。

+0

我不認爲這是問題所在。 random.nextInt(11)返回一個0到10之間的值(上限是唯一的)。 – jfrank

+0

啊,是的,非常真實,但隨機數字被製作並存儲在幾個數組中,然後被操縱並用作索引(相當混亂的代碼)。它可能是一個0遞減到-1,現在我更接近代碼。 –

1

ArrayIndexOutOfBoundsException拋出因爲 -

拋出,表明陣列已經用非法 索引訪問。該索引或者是負值,或者大於或等於該陣列的大小 。

我不能調試你的類現在,但這裏有一些例子,爲什麼程序會拋出這個exception-

說你有─

int[] integers = new int [2]; 

// This is fine since our array has two indexes which are 0 and 1 with length being 2  
integers[0] = 2; 

// However this not fine since our array has a length of 2. So there's no such index 2 so saying integers[2] would throw that error 
integers[2] = 3; 

// Likewise this is ok 
System.out.println(integers[1]); 

// But this will throe the same exception 
System.out.println(integers[3]); 

因此,調試程序並找到你的程序中有這樣的場景,所以你可以修復它們。

0

這有點難以遵循,但這裏是我認爲會出錯的地方。在啓動while (licznik< 22)的循環中,有另一個循環啓動while (passa < 8)。在內部循環中,您有licznik++。這是我的猜測,這個內部循環可能會運行太多次,並且結果爲licznik的值大於jakob陣列的大小。