Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Drools API中的NullPointerException_Java_Nullpointerexception_Drools - Fatal编程技术网

Java Drools API中的NullPointerException

Java Drools API中的NullPointerException,java,nullpointerexception,drools,Java,Nullpointerexception,Drools,运行Java程序时出现空指针异常。 addPackageFromDrl工作不正常,因此从builder.getPackage()返回的pkg为空 我在用口水 private static RuleBase readRules() throws DroolsParserException, IOException { Reader source = new InputStreamReader( MessageDroolsTest1.class.getClassLoader()

运行Java程序时出现空指针异常。
addPackageFromDrl
工作不正常,因此从
builder.getPackage()
返回的pkg为空

我在用口水

private static RuleBase readRules() throws DroolsParserException, IOException {
    Reader source = new InputStreamReader(   
    MessageDroolsTest1.class.getClassLoader().getResourceAsStream( "rule.drl" ) );

    System.out.println("Source:" + source);

    PackageBuilder builder = new PackageBuilder();
    builder.addPackageFromDrl( source );
    System.out.println("Builder:" + builder);

    Package pkg = builder.getPackage();
    System.out.println("Package:" + pkg);

    RuleBase ruleBase = RuleBaseFactory.newRuleBase();
    ruleBase.addPackage( pkg );
    return ruleBase;            
}  
我尝试了另一种方法,但仍然遇到运行时异常

private static KnowledgeBase createKnowledgeBase() {  
    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();  
            //Add drl file into builder  
    File drl = new File("rules.drl");  
    builder.add(ResourceFactory.newFileResource(drl), ResourceType.DRL);  
    if (builder.hasErrors()) {  
        throw new RuntimeException(builder.getErrors().toString());  
    }  

    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();  
            //Add to Knowledge Base packages from the builder which are actually the rules from the drl file.  
    knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());  
    return knowledgeBase;  
}  
错误

Exception in thread "main" org.drools.RuntimeDroolsException:  
Unable to load dialect 'org.drools.rule.builder.dialect.java.JavaDialectConfiguration:  
java:org.drools.rule.builder.dialect.java.JavaDialectConfiguration'

这对我来说是可行的,至少有一个正确的DRL文件

我建议你加上

    System.out.println("Builder:" + builder);
    if( builder.hasErrors() ){
    System.out.println("Builder has errors!");
}
如果这表明存在错误,请使用其他方法检索消息

Drools 6引入了一整套新类(Knowledge*),您应该使用它们。不建议使用内部API(或Drools 5中使用的API),您的代码可能会因任何版本更改而中断

**后来**

6.x的简单构建过程:

public void build() throws Exception {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kfs = kieServices.newKieFileSystem();
    FileInputStream fis = new FileInputStream( "simple.drl" );
    kfs.write( "src/main/resources/simple.drl",
                kieServices.getResources().newInputStreamResource( fis ) );
    KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
    Results results = kieBuilder.getResults();
    if( results.hasMessages( Message.Level.ERROR ) ){
        System.out.println( results.getMessages() );
        throw new IllegalStateException( "### errors ###" );
    }
    KieContainer kieContainer =
       kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
    KieBase kieBase = kieContainer.getKieBase();
    kieSession = kieContainer.newKieSession();
}

我也尝试了
KnowledgeBuilder
方法。我有个例外。更新了我的问题。您没有使用建议的6.x构建序列,请参阅我的添加。-检查org/drools/compiler/rule/builder/dialent/java/javadialenconfiguration.class是否位于类路径上的drools-compiler-6.0.0.Final.jar中。检查类路径上是否没有混合使用5.x和6-x jar-@laune I安装了drools 6 jar,上述错误消失。我现在得到这个错误<代码>java.lang.IllegalArgumentException:无法为类“org.drools.builder.KnowledgeBuilderFactoryService”实例化服务我在drools 6.0中没有看到drools api jar,因此从另一个项目复制。drools api jar在drools 6中不是可用的吗?如果没有,我应该为KnowledgeBuilder包含哪个jar?它在kie-internal-6.x.x.Final.jar中。将分发版中的所有JAR放入1目录-在大多数情况下,类路径定义足够:tag=6.0.0.Final;export CLASSPATH=“.:$root/drools-core-${tag}.jar:$root/kie-api-${tag}.jar:$root/kie-internal-${tag}.jar:$root/knowledge-internal-api-${tag}.jar:$root/drools-compiler-${tag}.jar:$root/antlr-runtime-3.5.jar:$root/ecj-3.7.2.7.Final.jar:$root/mvel2-2.1.1.8.3/quartz-1.8.3.3.3.jar:$root/drools-decisionjar:$quartz-tag.jar:$root/drools templates-${tag}.jar:$root/protobuf-java-2.5.0.jar:$root/slf4j-api-1.7.2.jar:$root/xstream-1.4.3.jar:$slf4j“@laune I添加了kie内部导入,eclipse说
KnowledgeBase
不推荐使用。。我不能使用KnowledgeBase api吗?谢谢@laune,我做了两件事。。