使用Builder模式初始化程序错误中的异常

时间:2014-09-10 02:40:07

标签: java for-loop map enums builder

我有一个构建器构造函数。我正在寻找一种方法来缩短几个不相似的声明,否则这些声明会占用很多行代码,这就是我想出的一个例子。元素是一个单独的枚举集,其思路是遍历它并将值添加到方法外的HashMap<Element, Double> multipliers

它符合要求,但我得到了multipliers.put(e, 1.0)的标题运行时异常。 Element枚举肯定存在并且在同一个文件中。一个类似名称的问题简单地回答&#34;如果在静态块中出现问题,那就会变得很疯狂。这似乎是抽象的,无益的。这里的映射仅适用于Builder分配给的类的实例,这就是我将它包含在构造函数中的原因。我错过了什么?

这些都是有希望帮助复制问题的例子:

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

    public final String name;

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

Type类

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); }
    } 
}

并且在TypeChecker中,在main之外声明我有类似于:

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

1 个答案:

答案 0 :(得分:1)

您获得multipliers.put(e, 1.0)的{​​{1}}的运行时异常,因为您没有初始化java.lang.NullPointerException地图。

如果您没有初始化任何对象,默认情况下它们会使用multipliers值进行初始化。

初始化 -

null