Почему мой BigInteger.add () получает исключение NullPointerException?

Я пытаюсь сделать печать треугольника Паскаля на сотню строк, но Java int, похоже, возвращает отрицательные значения. Я пытаюсь использовать BigInteger, но получаю исключение NullPointerException всякий раз, когда складываю два числа! Думаю, я их инициализировал. Вот мой код:

    import java.math.BigInteger;
    public class Pascal {
    public static void main(String[] args) { 
        BigInteger[][] p = new BigInteger[100][];

        p[0] = new BigInteger[3];
        p[0][1] = BigInteger.ONE;
        for (int i = 1; i <= N; i++) {
            p[i] = new BigInteger[i + 3];
            for(int j = 0; j < p[i].length; j++){
                p[i][j] = new BigInteger("0");
            }
            for (int j = 1; j < p[i].length - 1; j++)
                p[i][j] = p[i-1][j-1].add(p[i-1][j]); //NPE!

        }
        for (int i = 0; i <= N; i++) {
            for (int j = 1; j < p[i].length - 1; j++) {
                System.out.print(p[i][j] + " ");
            }
            System.out.println();
        }
    }
    }

person crispyfriedchicken    schedule 26.04.2012    source источник


Ответы (3)


Рассмотрим самую первую итерацию:

        for (int j = 1; j < p[i].length - 1; j++)
            p[i][j] = p[i-1][j-1].add(p[i-1][j]); //NPE!

p[i-1][j-1] разыменования p[0][0], которые, насколько я понимаю, не инициализированы.

person NPE    schedule 26.04.2012

Эти строки касаются:

    p[0][1] = BigInteger.ONE;
    for (int i = 1; i <= N; i++) 

Вы инициализируете [0][1], но не [0][0], и вы запускаете свои циклы с индексом 1, а не 0 (массивы индексируются по 0).

Подумайте, что должно занять позицию [0][0] и как соответственно должны начинаться циклы массива.

person yamen    schedule 26.04.2012

Недостаточно объявить ссылочное имя и тип; вам нужно выделить память для ссылки, на которую будет указывать.

Это классика с массивами. Я вижу много людей, которые объявляют такой массив, и задаются вопросом, почему они получают исключение NullPointerException, когда пытаются его использовать:

int numValues = 10;
Integer [] values = new Integer[numValues];  // All ten of these references initially point to null
// You have to point them to something
for (int i = 0; i < numValues; ++i) {
    values[i] = new Integer(i);
}
person duffymo    schedule 26.04.2012