Java 如果缺少输入值,则谓词的计算结果为未知(即空引用)

Java 如果缺少输入值,则谓词的计算结果为未知(即空引用),java,null,pmml,Java,Null,Pmml,我使用的是jpmml.evaluator.version 1.3.4和jpmml.model.version 1.3.5 我为评估准备了参数,并得到一个错误: org.jpmml.evaluator.MissingValueException(在第10678行或其附近):决策函数_1 位于org.jpmml.evaluator.mining.miningmodeleevaluator.evaluateSegmentation(miningmodeleevaluator.java:436) 位于o

我使用的是jpmml.evaluator.version 1.3.4和jpmml.model.version 1.3.5

我为评估准备了参数,并得到一个错误: org.jpmml.evaluator.MissingValueException(在第10678行或其附近):决策函数_1 位于org.jpmml.evaluator.mining.miningmodeleevaluator.evaluateSegmentation(miningmodeleevaluator.java:436) 位于org.jpmml.evaluator.mining.miningmodeleevaluator.evaluateClassification(miningmodeleevaluator.java:240) 位于org.jpmml.evaluator.mining.miningmodeleevaluator.evaluate(miningmodeleevaluator.java:207) 位于org.jpmml.evaluator.mining.miningmodeleevaluator.evaluate(miningmodeleevaluator.java:185)

守则:

//Feature class has 2 fields: String name, Object value

 public Double evaluate(List<Feature> givenFeaturesValue)  {
  Map<FieldName, FieldValue> arguments = new HashMap<>();

List<InputField> inputFields = evaluator.getInputFields();
Map<FieldName, InputField> featureProperties= new HashMap<>(inputFields.size());
        for(InputField inputField : inputFields) {
                    featureProperties.put(inputField.getName(), inputField);
        }

for(Entry<FieldName, InputField> featureProperty: featureProperties.entrySet()) {
            FieldValue value = featureProperty.getValue().prepare(null);    
            arguments.put(featureProperty.getKey(), value);
    }

    for(Entry<FieldName, InputField> featureProperty: featureProperties.entrySet()) {
        for(Feature givenFeature: givenFeaturesValue) {
            if(givenFeature.getFieldName().equals(featureProperty.getKey().getValue())) {
                FieldValue value = givenFeature.getValue().prepare(featureProperty.getValue());             
                arguments.put(featureProperty.getKey(), value);
            }
        }
    }

Map<FieldName, ?> results = evaluator.evaluate(arguments);

   //after this line I get the error
}
//要素类有两个字段:字符串名称、对象值
公共双重评估(列出给定的特征值){
映射参数=新的HashMap();
List inputFields=evaluator.getInputFields();
Map featureProperties=新HashMap(inputFields.size());
for(InputField InputField:inputFields){
put(inputField.getName(),inputField);
}
对于(条目featureProperty:featureProperties.entrySet()){
FieldValue=featureProperty.getValue().prepare(空);
参数.put(featureProperty.getKey(),值);
}
对于(条目featureProperty:featureProperties.entrySet()){
对于(要素给定要素:给定要素值){
if(givenFeature.getFieldName().equals(featureProperty.getKey().getValue())){
FieldValue=givenFeature.getValue().prepare(featureProperty.getValue());
参数.put(featureProperty.getKey(),值);
}
}
}
映射结果=evaluator.evaluate(参数);
//在这一行之后,我得到了错误
}
PMML文件:

<DataDictionary>
    <DataField name="GENDER" optype="categorical" dataType="string">
        <Value value="0"/>
        <Value value="1"/>
    </DataField>
    <DataField name="1GA" optype="categorical" dataType="string">
        <Value value="1GA DEFAULT"/>
        <Value value=""/>
        <Value value="&quot;"/>
        <Value value="#"/>
        <Value value="#NUM#"/>
</DataField>
    <DataField name="DB10" optype="categorical" dataType="integer">
        <Value value="0"/>
        <Value value="1"/>
    </DataField>
 <DataField name="ILR" optype="continuous" dataType="double"/>
 </DataDictionary>


只需为该输入字段提供一个非
null
值(而不是
null
值)


此异常相当于JPMML Evaluator的
java.lang.NullPointerException
。您知道如何用Java(和其他基于JVM的语言)处理NPE吗?

我不确定初始化参数映射的正确方法是什么。我添加了PMML文件的示例。如果参数没有值是否为空/null/0.0?
Evaluator#getInputFields()
提供输入字段列表。参数映射必须为所有参数提供一个值。有些输入字段接受
null
值,有些不接受-您可以使用JPMML Evaluator API区分这两种模式。在代码示例中,您将向所有输入字段传递一个
null
默认值,而不进行任何预检查。显然,您的模型不支持缺失值,因此在使用不完整的参数映射执行时,使用MissingValueException快速失败是正确的行为。