2013-08-27 3 views
-1

У меня есть большая проблема с этим исключением. Я новичок в программировании на Java (и программировании), поэтому .. Почему, когда второй класс возвращает два исключения из массива? Кроме того, когда возвращается только один массив (f.e «return 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 ++; внутри неправильного контура, сдвиньте его на две линии и выньте из внутреннего контура.

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. Это происходит, если Pula [gracz [licznik]]> 0 или Pula [bekaxd]> 0, но это никогда не будет, по крайней мере, не по моему прогону. – azzurroverde

0

IndexOutOfBoundsException occours при попытке получить доступ к позиции в массиве, который не существует:

Ев.

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 брошено because-

Брошенный, чтобы указать, что массив обращались с незаконным индексом. Индекс является либо отрицательным, либо большим или равным размеру .

Я не могу отладить класс прямо сейчас, но вот несколько примеров, почему программа будет бросить этот exception-

Допустим, вы have-

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.

Смежные вопросы