Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Программа выдает NullPointerException


Автор: Rasool 8.8.2011, 18:51
Написал программу, реализующую соединение элементов в схему "Исключающее ИЛИ", состоящую из двух нейронов, одного элемента "И", двух входов схемы и двух входов смещения нейронов. "-1" означает логическое "False", "+1" - "True".
При отладке в среде Netbeans выдает исключение указателя на Null:
Exception in thread "main" java.lang.NullPointerException
    at neuroinf.Neuroinf.main(Neuroinf.java:45)
Так и не понял, почему. В отладке nu1 нормально инициализируется.

Вот исходники программы:
Код

package neuroinf;

/** Neuroinf.java
 * Главный класс
 *
 */
public class Neuroinf {
    /**
     * @param args the command line arguments
     */public static class MyThreshold extends Threshold {

        @Override
        double calculate(double input) {
            double threshold = 0;
            if (input < threshold) 
                return -1;
            else return 1;                
            //throw new UnsupportedOperationException("Not supported yet.");
            }
        }
    public static void main(String[] args) {
        
        // read, readLine
        MyThreshold myThreshold = new MyThreshold();
        // TODO code application logic here
        Circuit circuit = new Circuit();
        Neuron neuron1 = new Neuron();
        Neuron neuron2 = new Neuron();
        InputElement inputElement1 = new InputElement();
        InputElement inputElement2 = new InputElement();
        InputElement shift1 = new InputElement(1);
        InputElement shift2 = new InputElement(1);
        AndElement andElement = new AndElement();
        
        // Создаем пороговые функции для нейронов
        neuron1.threshold = myThreshold;
        neuron2.threshold = myThreshold;
        
        // Сигналы смещения нейрона
        neuron1.offset = new NeuronInput (1, shift1);
        neuron2.offset = new NeuronInput (1, shift2);
        NeuronInput nu1 = new NeuronInput(1, inputElement1);
                
        // Соединяем элементы в схему
        neuron1.inputs.add(nu1); // Тут выдает исключение
        neuron1.inputs.add(new NeuronInput(-1, inputElement2));
        neuron2.inputs.add(new NeuronInput(-1, inputElement1));
        neuron2.inputs.add(new NeuronInput(1, inputElement2));
        
        andElement.Element1 = neuron1;
        andElement.Element2 = neuron2;
        circuit.Elements.add(inputElement1);
        circuit.Elements.add(inputElement2);
        circuit.Elements.add(shift1);
        circuit.Elements.add(shift2);
        circuit.Elements.add(neuron1);
        circuit.Elements.add(neuron2);
        circuit.Elements.add(andElement);
        
        // Инициализация входов
        inputElement1.output = -1;
        inputElement2.output = -1;
               
        // Расчет схемы
        circuit.calculate();
        
        System.out.println("Выход схемы:" + andElement.output);
    }
}


Код

package neuroinf;

import java.util.Iterator;
import java.util.List;

/** Neuron.java
 * Реализация класса нейрона
 */
public class Neuron extends Element {

    NeuronInput offset; // Вход смещения
    List<NeuronInput> inputs; // Список входных элементов к данному элементу
    Threshold threshold; // Ссылка на класс, реализующий пороговую функцию
    
    // Реализация функции расчета нейрона
    @Override
    void calculate() {
        double sum = 0;
        // Сумматор входов
        for (Iterator it = inputs.iterator(); it.hasNext();) {
            NeuronInput input = (NeuronInput) it.next();
            sum += input.element.output * input.weight;
            }
        // Суммируем с сигналом смещения 
        sum += offset.element.output * offset.weight;
        // Реализация порогового элемента
        output = threshold.calculate(sum);
        // throw new UnsupportedOperationException("Not supported yet.");
        }
}


Код

package neuroinf;

/** NeuronInput.java
 * Класс входа нейрона со ссылкой на входной к нейрону элемент и весом
 * 
 */
public class NeuronInput {
    double weight;
    Element element;
    NeuronInput (double w, Element el) {
        weight = w;
        element = el;        
    }
}


Код

package neuroinf;

/** InputElement.java
 *
 * Входной к схеме элемент со значением, нужен для реализации входного элемента
 */
public class InputElement extends Element {
    double input; // Значение входа
    InputElement () { }
    InputElement (double in) { input = in; }        
    @Override
    void calculate() {
        output = input; //throw new UnsupportedOperationException("Not supported yet.");
    }
    
}


Код

package neuroinf;

/**
 * Element.java
 * Абстрактный класс со значением выхода
 * Все элементы соединяются в схему так: 
 * Величина на вход элемента попадает с выхода output присоединенного к нему элемента
 */
abstract class Element {
    abstract void calculate (); // Вычисляет значение output исходя из выходов 
        // входных элементов
    public double output; // Выходное значение элемента
}


Код

package neuroinf;

import java.util.Iterator;
import java.util.List;

/**
 * Circuit.java
 * Реализация схемы
 */

public class Circuit {
       //List<Element> inputs; // Элементы, имитирующие вход
       // List<Element> outputElements; //Список выходных элементов
       List<Element> Elements; // Список элементов схемы, упорядоченных в порядке их расчета
       void calculate() { // Расчет параметров элементов согласно списку
            for (Iterator it = Elements.iterator(); it.hasNext();) {
            Element el = (Element) it.next();
            el.calculate();
            }
       }
}


Код

package neuroinf;

/**
 * Абстрактный класс для функции вычисления порога
 */
abstract class Threshold {
    // Пороговая функция, вычисляет значения по аргументу input
   abstract double calculate(double input);
  
}


Код

package neuroinf;

/**
 * AndElement.java
 * Двухвходовый элемент "И"
 */
public class AndElement extends Element {
    
    Element Element1, Element2; // Входные элементы
    @Override
    void calculate() {
        //throw new UnsupportedOperationException("Not supported yet.");
        if (Element1.output == -1 && Element2.output == -1) output = -1;
        if (Element1.output == 1 && Element2.output == -1) output = -1;
        if (Element1.output == -1 && Element2.output == 1) output = -1;
        if (Element1.output == 1 && Element2.output == 1) output = 1;
        }
}


Автор: Nofate 8.8.2011, 19:44
а вы уверены, что список inputs у вас инициализирован и не равен null?

Автор: Rasool 8.8.2011, 20:24
Цитата(Nofate @ 8.8.2011,  19:44)
а вы уверены, что список inputs у вас инициализирован и не равен null?

Батюшки! Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)