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

编程入门 行业动态 更新时间:2024-10-25 22:23:42
本文介绍了奇怪的“字符串索引超出范围:0”错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

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.uiponent.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.facesponent.UIComponentBase.encodeBegin(UIComponentBase.java:813) javax.facesponent.UIComponent.encodeAll(UIComponent.java:934) javax.facesponent.UIComponent.encodeAll(UIComponent.java:942) javax.facesponent.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.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?

谢谢。

推荐答案

让我们检查 ViewHandlerImpl#getActionURL()是什么( Mojarra只是开源)。这是Mojarra 2.0.2中方法的摘要/剥离摘录:

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:

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(); // ...

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

In other words, the passed-in viewId is an empty string instead of null or / or the normal path. The Mojarra viewhandler didn't expect it at all, hence this runtime exception. It can be 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 actually passing an empty string as view ID.

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

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.

更多推荐

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

本文发布于:2023-10-18 10:38:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1503988.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   索引   奇怪   错误

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!