Skip to main content
Participating Frequently
November 12, 2015
Question

Please help me in handling java.lang.StringIndexOutOfBoundsException: String index out of range: -1 error

  • November 12, 2015
  • 3 replies
  • 1374 views

Hi all,

I am very new to cfscripts.

I am having below function  <cffunction name="newReplace" > and whenever I am calling this function I am getting java.lang.StringIndexOutOfBoundsException: String index out of range: -1 error.

I think I missed some validation to check the null but unable to identify.

<cffunction name="newReplace" returntype="string" description="Replace the original CF9 Replace() and ReplaceNoCase() which don't support some UTF-8 string">

  <cfargument name="stg" type="string">

  <cfargument name="origStg" >

  <cfargument name="rplStg" >

  <cfargument name="all" type="boolean" default=true>

  <cfargument name="caseSensitive" type="boolean" default=false>

  <cfset var result="">

  <cfscript>

  var oStringBuffer = createObject("java","java.lang.StringBuffer");

  var i = 0;

  var tmpStg = "";

  oStringBuffer = oStringBuffer.init(arguments.stg);

  while(i + origStg.length() <= oStringBuffer.length()) {

  tmStg = oStringBuffer.substring(i, i + origStg.length());

  if(tmStg.equalsIgnoreCase(origStg)) {

  oStringBuffer.replace(i, i + origStg.length(), rplStg);

  if(!all)

  break;

  else

  i += rplStg.length();

  }

  else

  i++;

  }

  result = oStringBuffer.toString();

  </cfscript>

  <cfreturn result/>

  </cffunction>

function call:

<cfset sndMsg = newReplace(sndMsg,"%EXPIRYDATE%",expiryDate,"ALL")>

error:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

at java.lang.String.substring(Unknown Source)

at coldfusion.runtime.StringFunc.Replace(StringFunc.java:390)

at coldfusion.runtime.CFPage.newReplace(CFPage.java:2633)

This topic has been closed for replies.

3 replies

BKBK
Community Expert
February 13, 2016

Lakshmikanth S_13 wrote:

function call:

<cfset sndMsg = newReplace(sndMsg,"%EXPIRYDATE%",expiryDate,"ALL")>

Two fatal mistakes:

1) Invoking the function recursively with the variable sndMsg sends it into an infinite loop.

2) The last argument should be a boolean (True or False) rather than a string ("ALL").

James Moberg
Inspiring
February 11, 2016

I ran into a similar issue using ColdFusion 9/Windows.  Using rereplacenocase(textMessage, "[hash]", newValue, "all") was throwing a "String index out of range: -1" error on a value returned from a MSSQL nvarchar datatype.  (If I changed the word "hash" to anything else it would work, but possibly because it wasn't finding a match.)  I copied the original "textMessage" value out of the database, pasted it into my text editor, copied it back and pasted it into the database and ran the script again and then it worked. I think replacenocase() may have issues with UTF-8 or possibly extended-ASCII invisible characters.

WolfShade
Brainiac
November 12, 2015

Well, for one thing, you want to replace "<=" with "lte".  Even though CFSCRIPT is a lot like JavaScript, you still have to use CF conditionals and concatenations, although + will still do math.

I don't really understand exactly what you're doing with this, and I've never heard of Replace() or ReplaceNoCase() having any UTF-8 issues, but this should at least get you going in the right direction.

HTH,

^_^