Java 奇怪的“字符串索引超出范围:0”错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2379693/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 06:45:57  来源:igfitidea点击:

strange "String index out of range: 0" error

javajsfseam

提问by Cristian Boariu

I have a huge application and at some point, when a redirect is involved i received this strange error:

我有一个巨大的应用程序,在某些时候,当涉及重定向时,我收到了这个奇怪的错误:

Caused by java.lang.StringIndexOutOfBoundsException with message: "String index out of range: 0"    
java.lang.String.charAt(String.java:687)
com.sun.faces.application.ViewHandlerImpl.getActionURL(ViewHandlerImpl.java:652)
org.jboss.seam.jsf.SeamViewHandler.getActionURL(SeamViewHandler.java:74)
com.sun.facelets.FaceletViewHandler.getActionURL(FaceletViewHandler.java:803)
org.ajax4jsf.application.ViewHandlerWrapper.getActionURL(ViewHandlerWrapper.java:86)
org.jboss.seam.ui.util.ViewUrlBuilder.<init>(ViewUrlBuilder.java:25)
org.jboss.seam.ui.component.UISeamCommandBase.getUrl(UISeamCommandBase.java:48)
org.jboss.seam.ui.renderkit.LinkRendererBase.doEncodeBegin(LinkRendererBase.java:26)
org.jboss.seam.ui.util.cdk.RendererBase.encodeBegin(RendererBase.java:79)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:813)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:934)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:942)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:942)
com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
org.jboss.seam.web.RewriteFilter.doFilter(RewriteFilter.java:63)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
java.lang.Thread.run(Thread.java:619)

I've spent two hours debugging and so on, but did not find any clue... It's just weird because the error log does not tell something clear...(which string, which property is involved etc).

我花了两个小时调试等等,但没有找到任何线索......这很奇怪,因为错误日志没有明确说明......(哪个字符串,涉及哪个属性等)。

Does anyone can guess something more from the stacktrace?

有没有人能从堆栈跟踪中猜出更多的东西?

Thanks.

谢谢。

采纳答案by BalusC

Let's check what ViewHandlerImpl#getActionURL()does (Mojarra is just open source). Here's is a summarized/stripped extract of the method as it is in Mojarra 2.0.2:

让我们看看有什么ViewHandlerImpl#getActionURL()作用(Mojarra 只是开源的)。这是 Mojarra 2.0.2 中方法的总结/剥离摘录:

public String getActionURL(FacesContext context, String viewId) {
    if (context == null) throw new NullPointerException();
    if (viewId == null) throw new NullPointerException();
    if (viewId.charAt(0) != '/') throw new IllegalArgumentException();
    // ...

In other words, the passed-in viewIdis an empty stringinstead of nullor /or the normal path. The Mojarra viewhandler didn't expect it at all, hence this runtime exception. It canbe a bug in the view handler of Mojarra that it should handle empty strings as well, but it can also be a bug in the view handler of either Ajax4jsf, Facelets or Seam that it should never pass an empty string through up. It can also be a bug in your own code that you're actuallypassing an empty string as view ID.

换句话说,传入的viewId是一个空字符串,而不是nullor/或普通路径。Mojarra 视图处理程序根本没有预料到它,因此这个运行时异常。它可能是 Mojarra 的视图处理程序中的一个错误,它也应该处理空字符串,但它也可能是 Ajax4jsf、Facelets 或 Seam 的视图处理程序中的一个错误,它不应该向上传递空字符串。这也可能是您自己的代码中的一个错误,即您实际上将空字符串作为视图 ID 传递。

If the problem isn't in your code, then I would start with upgrading what can be upgraded to see if it resolves the problem. Maybe it was already reported before as a bug and fixed in a newer release. If that doesn't help, I would check the classpath for duplicate JAR files of different versions which might have collided with each other.

如果问题不在您的代码中,那么我将从升级可以升级的内容开始,看看它是否能解决问题。也许它之前已经作为错误报告并在较新的版本中修复。如果这没有帮助,我会检查类路径中是否存在可能相互冲突的不同版本的重复 JAR 文件。

回答by Jorn

My first guess would be that you have an empty string "", of which you are trying to get the first character (at index 0)

我的第一个猜测是您有一个空字符串"",您正在尝试获取其中的第一个字符(在索引 0 处)

回答by AntuanSoft

In my case i ve solved the issure reviewing all my page′s ids. I was rendering a facelet in two cases and in one of those there was a reference to an id that not existed.

就我而言,我已经解决了我所有页面 ID 的问题。我在两种情况下渲染了一个 facelet,在其中一种情况下,引用了一个不存在的 id。

In my jsf facelet: The reference to #{finishBtn} did not exists because it was not passed from the page which called this.

在我的 jsf facelet 中:对 #{finishBtn} 的引用不存在,因为它不是从调用它的页面传递的。

<ui:composition>
    ......
    ....
     <a4j:commandButton title="#{i18n.editar_er_tip}"
                        image="/images/edit.png" style="width:16px;height:16px" reRender="entregablesTable,#{finishBtn},entregableBotton"
                        action="#{actionBean[editMethod]}"
                        onclick="Richfaces.showModalPanel('waitPanel')"
                        oncomplete="Richfaces.hideModalPanel('waitPanel');Richfaces.showModalPanel('entregableBotton')">
    </a4j:commandButton>
    ....
    ..
</ui:composition>

I have solved with a previous evaluation

我已经解决了以前的评估

<c:if test="${empty finishBtn}">
        <c:set var="finishBtn" value="editButton" />
</c:if>