Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа выдает NullPointerException 
V
    Опции темы
Rasool
Дата 8.8.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 4.6.2011

Репутация: нет
Всего: нет



Написал программу, реализующую соединение элементов в схему "Исключающее ИЛИ", состоящую из двух нейронов, одного элемента "И", двух входов схемы и двух входов смещения нейронов. "-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;
        }
}



Это сообщение отредактировал(а) Rasool - 8.8.2011, 18:59
PM MAIL   Вверх
Nofate
Дата 8.8.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 4
Всего: 8



а вы уверены, что список inputs у вас инициализирован и не равен null?


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
Rasool
Дата 8.8.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 4.6.2011

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) Rasool - 8.8.2011, 21:01
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.