有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

prolog Java帮助StringIndexOutOfBoundsException字符串索引超出范围:1

我的一些代码有问题,我真的无法排除这个错误

我正在使用Interprolog(Java+Prolog)参见here

以下是stacktrace:

  Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at      com.declarativa.interprolog.AbstractPrologEngine.copyToTemp(AbstractPrologEngine.java)
 at com.declarativa.interprolog.AbstractPrologEngine.consultFromPackage(AbstractPrologEngine.java)
 at LoginHandler.actionPerformed(LoginHandler.java:24)
 at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
 at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
 at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
 at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
 at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
 at java.awt.Component.processMouseEvent(Unknown Source)
 at javax.swing.JComponent.processMouseEvent(Unknown Source)
 at java.awt.Component.processEvent(Unknown Source)
 at java.awt.Container.processEvent(Unknown Source)
 at java.awt.Component.dispatchEventImpl(Unknown Source)
 at java.awt.Container.dispatchEventImpl(Unknown Source)
 at java.awt.Component.dispatchEvent(Unknown Source)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
 at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
 at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
 at java.awt.Container.dispatchEventImpl(Unknown Source)
 at java.awt.Window.dispatchEventImpl(Unknown Source)
 at java.awt.Component.dispatchEvent(Unknown Source)
 at java.awt.EventQueue.dispatchEvent(Unknown Source)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.run(Unknown Source)

以及有关守则:

      myEngine = new NativeEngine();
  myEngine.consultFromPackage("C:\\interprolog212a\\userlist.p", LoginHandler.class);
  boolean x = myEngine.deterministicGoal("hasAccess(user,pass)");

有什么想法吗?我在撞砖墙

第24行是我发布的第二行代码

编辑:用户列表的内容。p:

hasAccess(tom,123).
hasAccess(bob,456).

根据下面的一些建议,我将loginhandler和相关类移动到它们自己的包和userlist中。p到包,现在我得到这个错误:

com.declarativa.interprolog.util.IPException: Problem consulting from package         archive:C:\Users\Keval\AppData\Local\Temp\IP_5283895338735856757\userlist.p

共 (2) 个答案

  1. # 1 楼答案

    我想开源是不错的选择。它正在这样做:

    String className = rc.getName();    
    String packageName = className.substring(0,className.lastIndexOf('.'));
    

    rc是您的调用类。因此,我假设您的LoginHandler类在默认包中,这会使代码出错吗?试着把它放在一个包中,也就是说,将package blah;添加到它的顶部,并将它移动到具有该名称的目录中

    它之所以这样做,是因为它假定userlist.pl实际上与代码位于同一位置,并且它试图使用包名查找代码加载的位置。我不认为你可以像你实际尝试的那样使用consultFromPackage(),因为它应该只能解析一个文件名,而不能解析一个完整的路径

    哦,你可以找到源头。它在从the website链接的zip file

  2. # 2 楼答案

    路径中的第二个\\是否会混淆它?如果它正在检查路径中的每个目录,它可能会被一个空字符串弄糊涂,也许