1

Ребят подскажите, есть класс, в нём переменные:

double[][] weightIH;
double[][] weightHO;

Значение по умолчание их null, есть метод где значения этих переменных инициализируются:

void test() {
    weightIH = new double[1 + NUM_IN][NUM_HID];
    weightHO = new double[1 + NUM_HID][NUM_OUT];
    for (int j = 0; j < NUM_HID; j++)
        for (int i = 0; i < 1 + NUM_IN; i++) 
            weightIH[i][j] = 2.0 * (randomize() - 0.5) * smallwt;

    for (int k = 0; k < NUM_OUT; k++)
        for (int j = 0; j < 1 + NUM_HID; j++)
            weightHO[j][k] = 2.0 * (randomize() - 0.5) * smallwt;
}

Затем, имеется класс где нужны значения этих переменных:

class Training {
    void name() {
      Network network = new Network();
        for (int j = 0; j < numHidden; j++) {
            sumH[j] = network.weightHO[0][j];
            for (int i = 0; i < numInput; i++)
                sumH[j] += input[p][i] * network.weightIH[1 + i][j];
            hidden[j] = 1.0 / (1.0 + Math.exp(-sumH[j]));
        }
    }
}

После запуска, ловлю NullPointerException, т.е. в классе Training переменные weightIH и weightOH равны null.

Как решить проблему с передачей значений переменных, без null?

  • так нет вызова метода void test() поэтому переменные и не инициализируются. И вообще наверно лучше инициализировать значения в конструкторе. Т.е. в классе Network делать конструктор в котором инициализировать данный переменные. – I. Smirnov Apr 29 '16 at 12:29
  • 2
  • Update: у вас требуемые массивы не хранят никаких значений. они лишь проинициализированы были, т.е. под них выделилось место. А значений не лежат там, в итоге при обращении к элементам массивов возвращается null – I. Smirnov Apr 29 '16 at 12:33
  • Забыл код добавить для заполнение, они инициализируются и заполняются в методе. Вызов методов в main сначала метод с test() а потом уже и метод из класса Training name() – D.Stifler Apr 29 '16 at 12:41
  • в вашем методе Training.name создается отдельный объект Network. То что вы где-то там в main у какого-то другого объекта что-то вызвали на него не влияет. Возможно, вам стоит изменить метод name() на name( Network network ) и передавать нужный объект в качестве параметра. – zRrr Apr 29 '16 at 12:52
  • Спасибо, думал если у main вызвать будет влиять – D.Stifler Apr 29 '16 at 12:54

2 Answers2

1
  1. у вас требуемые массивы не хранят никаких значений. они лишь сами проинициализированы были, т.е. под них выделилось место. А значений не лежат там, в итоге при обращении к элементам массивов возвращается null

  2. Нет вызова метода void test() для объекта Network, поэтому переменные и не инициализируются. И вообще наверно лучше инициализировать значения в конструкторе. Т.е. в классе Network делать конструктор в котором инициализировать данный переменные

1

ты создаешь объект, но не иницилизируешь методом test()

class Training {
    void name() {
      Network network = new Network();
// после этого нужно вызвать метод инициализации 
        network.test();
// дальше будут работать
        for (int j = 0; j < numHidden; j++) {
            sumH[j] = network.weightHO[0][j];
            for (int i = 0; i < numInput; i++)
                sumH[j] += input[p][i] * network.weightIH[1 + i][j];
            hidden[j] = 1.0 / (1.0 + Math.exp(-sumH[j]));
        }
    }
}

p.s. не пойму почему код не добавляется нормально

  • а т.е. нужно в классе Training нужно создать Объект и просто вызвать test() и null пропадет? Почему же тогда в main не работает, я вызываю test() а затем и name() ? – D.Stifler Apr 29 '16 at 12:53
  • @Цовак Саакян Нужно выделить текст и нажать Ctrl+K или кнопку на панели – Алексей Шиманский Apr 29 '16 at 12:53
  • либо одиночный кавычки обратный используешь(который на кнопке с Ё) либо отступ. а вообще справка там есть и кнопки для форматирования) – I. Smirnov Apr 29 '16 at 12:53
  • спасибо большое. у меня исчезла меню с кнопками форматирования. но после обновления страницы все норм получилось – Senior Pomidor Apr 29 '16 at 13:01