2015-04-07 5 views
0

Я делаю программу бинго. В настоящее время я просто хочу, чтобы 2D-массив представлял числа на бинго-карте. Колонка 1 может содержать только 1-15 Колонка 2 16-30 Колонка 3 31-45 и т.д ....Я иногда получаю ошибки, а иногда нет?

Это мой код до сих пор, и иногда он вызывает исключение, но иногда это не что странно.

private int[][] bingoCard = new int [5][5]; 
public BingoCard() 
{ 
    int [][]bingoCardInit = new int [5][5]; 
    bingoCard = bingoCardInit; 
} 

public void fillInCard() 
{ 
    int arrayIndex = 0; 
    Integer[] arr = new Integer[16]; 
    for (int i = 1; i <= 15; i++) 
    { 
     arr[i] = i; 
    } 
    Collections.shuffle(Arrays.asList(arr)); 
    for(int rowIndex = 0; rowIndex<5; rowIndex++) 
    { 
     bingoCard[0][rowIndex] = arr[rowIndex]; 
     System.out.println(bingoCard[0][rowIndex]); 
    } 

    Integer[] arr1 = new Integer[16]; 
    for (int i = 16; i <= 30; i++) 
    { 
     arr1 [arrayIndex]= i; 
     arrayIndex++; 
    } 
    Collections.shuffle(Arrays.asList(arr1)); 
    arrayIndex = 0; 
    for(int rowIndex = 0; rowIndex<5; rowIndex++) 
    { 
     bingoCard[1][arrayIndex] = arr1[rowIndex]; 
     System.out.println(bingoCard[1][arrayIndex]); 
     arrayIndex++; 
    } 

    arrayIndex = 0; 
    Integer[] arr2 = new Integer[16]; 
    for (int i = 31; i <= 45; i++) 
    { 
     arr2 [arrayIndex]= i; 
     arrayIndex++; 
    } 
    Collections.shuffle(Arrays.asList(arr2)); 
    arrayIndex = 0; 
    for(int rowIndex = 0; rowIndex<5; rowIndex++) 
    { 
     bingoCard[2][arrayIndex] = arr2[rowIndex]; 
     System.out.println(bingoCard[2][arrayIndex]); 
     arrayIndex++; 
    } 

    arrayIndex = 0; 
    Integer[] arr3 = new Integer[16]; 
    for (int i = 46; i <= 60; i++) 
    { 
     arr3 [arrayIndex]= i; 
     arrayIndex++; 
    } 
    Collections.shuffle(Arrays.asList(arr3)); 
    arrayIndex = 0; 
    for(int rowIndex = 0; rowIndex<5; rowIndex++) 
    { 
     bingoCard[3][arrayIndex] = arr3[rowIndex]; 
     System.out.println(bingoCard[3][arrayIndex]); 
     arrayIndex++; 
    } 

} 

Мне просто интересно, почему это иногда вызывает исключение.

+2

Можете ли вы опубликовать трассировку стека? –

+0

Исключение в потоке «основного» java.lang.NullPointerException \t на BingoCard.fillInCard (BingoCard.java:37) \t в BingoCard.main (BingoCard.java:78) но иногда изменяется на исключение в потоке «Основной "java.lang.NullPointerException \t в BingoCard.fillInCard (BingoCard.java:23) \t в BingoCard.main (BingoCard.java:78) и разные номера по какой-то причине – Herofire

+1

вы можете указать эти строки в своем коде ? –

ответ

2

Это, вероятно, почему:

Integer[] arr = new Integer[16]; 
for (int i = 1; i <= 15; i++) 
{ 
    arr[i] = i; 
} 

В вашем цикле вы инициализировать все элементы массива для первого элемента, за исключением. Из-за этого значение arr[0] равно null.

Позже вы перетасовать элементы в Integer массива и попытка присвоить первые пять значений в свой int[][] массив ...

Collections.shuffle(Arrays.asList(arr)); 
for(int rowIndex = 0; rowIndex<5; rowIndex++) 
{ 
    bingoCard[0][rowIndex] = arr[rowIndex]; 

В некоторых случаях из-за Integer массив будучи перемешиваются, нулевой элемент будет одним из первых пяти элементов. Поскольку вы пытаетесь присвоить Integerint, распаковка будет происходить в процессе использования метода intValue; а в случае нулевого элемента выбрано исключение NullPointerException.

Простым решением было бы использовать arrayIndex, как и в других ваших петлях, и уменьшить размер ваших массивов до 15, чтобы избежать наличия в них нулевых элементов.

Integer[] arr = new Integer[15]; 
for (int i = 1; i <= 15; i++) 
{ 
    arr[arrayIndex++] = i; 
} 
Смежные вопросы