2014-09-10 2 views
1

У меня есть конструктор-конструктор. Я искал способ сократить несколько несходных заявлений, которые в противном случае занимали бы много строк кода, и это пример того, что я придумал. Элемент представляет собой отдельный набор перечислений, и идея состоит в его прокрутке и добавлении значений к HashMap<Element, Double> multipliers вне метода.Исключение в ошибке инициализатора с шаблоном Builder

Он соответствует штрафу, но я получаю условное исключение во время выполнения для multipliers.put(e, 1.0). Перечисление элемента определенно существует и находится в одном файле. Вопрос с похожим именем просто отвечает «сошел с ума, если что-то пошло не так в статическом блоке», это кажется абстрактным и бесполезным. Карта здесь применима только к экземплярам класса, которому назначен Builder, поэтому я включил его в конструктор. Что мне не хватает?

Это все предназначены в качестве примеров, которые мы надеемся помочь тиражированию проблемы:

public enum Element { 
    ALPHA("Alpha"), 
    BETA("Beta"), 
    GAMMA("Gamma"), 
    DELTA("Delta") 

    public final String name; 

    Element(String name) { this.name = name; } 
} 

Тип класс

import java.util.HashMap; 

public class Type { 
    String name; 
    HashMap<Element, Double> multipliers; 

    Type(Builder p) { 
     name = p.name; multipliers = p.multipliers; 
    } 

    static class Builder { 
     final String name; 
     HashMap<Element, Double> multipliers; 

     public Builder(Element element) { 
      this.name = element.name; 
      // Default values 
      for (Element e : Element.values()) { 
       multipliers.put(e, 1.0); 
      } 
     } 
     public Builder nullify(Element... elements) { 
      for (Element e : elements) { multipliers.put(e, 0.0); } 
      return this; 
     } 
     public Type generate() { return new Type(this); } 
    } 
} 

и проверки типов, объявленных вне основных У меня есть строки, похожие на:

static Type premier = new Type.Builder(Element.ALPHA) 
    .nullify(Element.GAMMA, Element.DELTA) 
    .generate(); 
+0

Можете ли вы пожалуйста распечатать трассировку стека –

+0

Это выглядит как какая-то переменная не инициализирована. Проверьте код, чтобы узнать, равен ли элемент или множители. Если вы не можете найти, вставьте еще один код, чтобы узнать, как вы инициализируетесь и вызываете конструктор Builder. –

+0

Пожалуйста, предоставьте [MCVE] (http://stackoverflow.com/help/mcve). В нас нет смысла гадать, что не так с кодом, который вы нам не дали. –

ответ

1

Вы получаете исключение Runtime для multipliers.put(e, 1.0) whic h является java.lang.NullPointerException, потому что вы не инициализируете multipliers Карта.

Если вы не инициализируете какой-либо объект, по умолчанию они инициализируются значением null.

Initialize

It-
HashMap<Element, Double> multipliers =new HashMap<Element, Double>(); 
+0

Я так тронут тем, насколько простой была ошибка, и как долго я искал все неправильные вещи и бесполезно добавлял методы «исправить» повсюду. Спасибо. – Legato

Смежные вопросы