2010-02-12 90 views
0

我遇到了一些我的代码的问题,我真的不能解决这个错误。Java的帮助 - StringIndexOutOfBoundsException - 字符串索引超出范围:-1

我使用Interprolog(Java +序言)看到here

这里是堆栈跟踪:

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行是我发布的第二行代码。

编辑:userlist.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 
+0

userList.pl是什么样的?我唯一的猜测是,某种程度上,Access(用户,传球)对该文件中的任何内容都不会很好。 – 2010-02-12 15:04:33

+0

您好,谢谢你的回复。我编辑了原始文章,现在您可以看到userlist.pl的内容。 干杯 – KP65 2010-02-12 15:10:53

+0

您是否有权访问NativeEngine的源代码,以查看它试图获取子字符串的方式以及它如何获取子字符串的索引? – justkt 2010-02-12 15:16:02

回答

2

Yay for open source I suppose。它是这样做的:

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

rc是你的调用类。所以我想你的LoginHandler类是在默认包中,这是跳动这个代码?尝试将它放在一个包中,即将package blah;添加到它的顶部并将其移动到具有该名称的目录中。

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

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

+0

你好。我也尝试过ConsultFromPackage(userlist.pl,class),因为pl文件确实与java文件/代码位置在相同的包/目录中。 – KP65 2010-02-12 15:37:58

+0

@keval你可能错过了我的第二次编辑。尝试将'LoginHandler'放在一个包中。我假设它目前在默认包中(即顶部没有包声明)。 – wds 2010-02-12 15:40:09

+0

我已经把它移到了它自己的包里,会让你知道发生了什么。 – KP65 2010-02-12 15:46:14

0

是第二个\\在路径上混淆了吗?如果它正在做任何事情来检查路径中的每个目录,它可能会被空字符串混淆,也许?

相关问题