ошибка нулевой вероятности со случайным - PullRequest
0 голосов
/ 21 февраля 2011

ТАК У меня есть следующий код

public void rand(int N){

  double[]x=new double[N];
  double[]y=new double[N];
  double[][]res=new double[N][N];
  for(int i=0;i<N;i++){x[i]=random.nextDouble();y[i]=random.nextDouble();}

}

но он вернул бы nullpointerexceptionerror в цикле for .... кто-нибудь может сказать мне, что с ним не так?

Ответы [ 5 ]

2 голосов
/ 21 февраля 2011

Где вы инициализировали случайные? Я этого не вижу.

У вас будет другая проблема: массивы x и y и матрица res объявляются, инициализируются и сразу выходят из области видимости при выходе из метода. Вся эта работа напрасна.

Я бы подумал об этом больше так:

import java.util.Random;

/**
 * MatrixTest
 * @author Michael
 * @since 2/20/11
 */
public class MatrixTest
{
    private static final int DEFAULT_SIZE = 3;
    private double [] x;
    private double [] y;
    private int n;

    public static void main(String[] args)
    {
        MatrixTest m = new MatrixTest();
        System.out.println(m);
    }

    public MatrixTest()
    {
        this(DEFAULT_SIZE);
    }

    public MatrixTest(int n)
    {
        this.init(n);
    }

    public void init(int n)
    {
        Random random = new Random(System.currentTimeMillis());

        this.x = new double[n];
        this.y = new double[n];
        this.n = n;
        for (int i = 0; i < this.n; i++)
        {
            x[i] = random.nextDouble();
            y[i] = random.nextDouble();
        }
    }

    @Override
    public String toString()
    {
        final StringBuilder sb = new StringBuilder();
        sb.append("MatrixTest");
        sb.append("{x=").append(x == null ? "null" : "");
        for (int i = 0; x != null && i < x.length; ++i)
        {
            sb.append(i == 0 ? "" : ", ").append(x[i]);
        }
        sb.append(", y=").append(y == null ? "null" : "");
        for (int i = 0; y != null && i < y.length; ++i)
        {
            sb.append(i == 0 ? "" : ", ").append(y[i]);
        }
        sb.append(", n=").append(n);
        sb.append('}');
        return sb.toString();
    }
}
1 голос
/ 21 февраля 2011

Насколько я могу судить, все выглядит нормально, кроме случайной величины?Где это определено?Кроме того, что такое сообщение об ошибке?

Исходя из этого, я подозреваю, что случайная переменная не инициализирована.

1 голос
/ 21 февраля 2011

random кажется единственным объектом в этом фрагменте кода, все остальное - примитив. Где создается экземпляр random?

0 голосов
/ 21 февраля 2011

Я не вижу объявления для random. Я предполагаю, что это переменная экземпляра, объявленная во включающем классе. Если это так, я подозреваю, что random не был инициализирован со ссылкой на объект Random. Когда оператор ... = random.nextDouble(); выполняется со ссылкой на объект null, результатом является NPE.


Кстати, если вы исправите вопиющие проблемы стиля с помощью оператора loop, источник вашей проблемы будет легче обнаружить.

for (int i = 0; i < N; i++) {
    x[i] = random.nextDouble();  // NPE on this line
    y[i] = random.nextDouble();
}

Хороший стиль - лучшая практика. Потратив несколько секунд на правильное форматирование кода, вы можете сэкономить минуты, когда вы / кто-то еще его читаете, и часы (или даже дни), если ваш плохой стиль скрывает ошибку ... например:

for(i=0;i<N;i++)x[i]=random.nextDouble();y[i]=random.nextDouble();

(ОК ... «роковые» ошибки, связанные со стилем в приведенном выше примере, не те, что вы совершили. Но это не лишает меня смысла.)

0 голосов
/ 21 февраля 2011

Возможно ли, что random равно null?

...