【发布时间】:2011-11-12 07:03:55
【问题描述】:
我有一个函数,它返回从静态文本构建的字符串值并传递参数:
<cffunction name="additionalText" access="private" returntype="String"
hint="Adds additional text around the field value for certain dataTypes.">
<cfargument name="type" type="String" required="true" />
<cfargument name="val" type="String" required="true" />
<cfscript>
var text = ARGUMENTS.val;
if (ARGUMENTS.type == "A")
text = ARGUMENTS.val & "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ";
else if (ARGUMENTS.type == "B")
text = ARGUMENTS.val & "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum molestie pretium sodales. Aliquam neque eros, aliquet nec tincidunt rutrum, commodo sit amet enim. Pellentesque habitant";
// Bad one - causing errors
else if (ARGUMENTS.type == "C")
text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum molestie pretium sodales. Aliquam neque eros, aliquet nec tincidunt rutrum, commodo sit amet enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse vitae orci sed arcu semper convallis ut nec quam. Fusce viverra, turpis vestibulum congue tristique, arcu dolor feugiat orci, non vestibulum orci nisi non lorem. Donec et urna ligula. Sed vulputate lacinia orci, in consequat mauris tincidunt vel. Nam molestie rhoncus arcu, eget vestibulum neque commodo consequat. Nullam scelerisque condimentum nisi, et elementum quam sed. ";
return text;
</cfscript>
</cffunction>
“坏”字符串的长度为 647。对该函数的任何调用都会引发 ArrayIndexOutOfBounds 异常。
当我缩短有问题的字符串时,不会发生异常。我真的没有选择 - 我需要完整的字符串可用。
为什么会发生这种情况,更重要的是,我能做些什么来解决它?
更新:
我只是尝试从不同的位置调用该函数,它工作正常:
<cfscript>
function getIt(type, val){
return additionalText(type, val);
}
x.func = getIt;
</cfscript>
<cfdump var="#x.func("A", "XXXX")#" />
现在很迷茫……
更新:
以下是启用了 Robust Exception 的 ColdFusion 异常的全文:
The web site you are accessing has experienced an unexpected error.
Please contact the website administrator.
The following information is meant for the website developer for debugging purposes.
Error Occurred While Processing Request
Resources:
Check the ColdFusion documentation to verify that you are using the correct syntax.
Search the Knowledge Base to find a solution to your problem.
Browser Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Remote Address ....
Referrer ....
Date/Time 07-Sep-11 12:43 PM
Stack Trace (click to expand)
java.lang.ArrayIndexOutOfBoundsException
更新:
这是我调用函数的方式......我有一个“字段”数组。数组中的每个“字段”对象都有几个在别处设置的属性。这些属性之一是“formatFunction”。有些字段有一个 formatFunction 值,例如“formatPhone”或“formatDate”,它们是字段对象中的函数名称:
Field.cfc:
<cfcomponent>
<cffunction name="init" access="package" returntype="Field" output="false">
<!--- Default format Function --->
<cfset THIS.formatFunction = additionalText />
<cfif THIS.name EQ "Date">
<cfset THIS.formatFunction = formatDate />
</cfif>
</cffunction>
<cffunction name="formatDate" access="private" returntype="String">
<cfargument name="val" type="String" required="true" />
<cfreturn DateFormat(ARGUMENTS.val, "dddd mmmm d, yyyy") />
</cffunction>
<cffunction name="additionalText" access="private" returntype="String"
hint="Adds additional text around the field value for certain dataTypes.">
<cfargument name="type" type="String" required="true" />
<cfargument name="val" type="String" required="true" />
<cfscript>
var text = ARGUMENTS.val;
if (ARGUMENTS.type == "A")
text = ARGUMENTS.val & "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ";
else if (ARGUMENTS.type == "B")
text = ARGUMENTS.val & "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum molestie pretium sodales. Aliquam neque eros, aliquet nec tincidunt rutrum, commodo sit amet enim. Pellentesque habitant";
// Bad one - causing errors
else if (ARGUMENTS.type == "C")
text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum molestie pretium sodales. Aliquam neque eros, aliquet nec tincidunt rutrum, commodo sit amet enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse vitae orci sed arcu semper convallis ut nec quam. Fusce viverra, turpis vestibulum congue tristique, arcu dolor feugiat orci, non vestibulum orci nisi non lorem. Donec et urna ligula. Sed vulputate lacinia orci, in consequat mauris tincidunt vel. Nam molestie rhoncus arcu, eget vestibulum neque commodo consequat. Nullam scelerisque condimentum nisi, et elementum quam sed. ";
return text;
</cfscript>
</cffunction>
</cfcomponent>
我在特定点循环遍历数组,为每个“字段”调用 formatFunction:
for (i=1; i<=ArrayLen(THIS.aPDFFormFields); i=i+1) {
field = THIS.aPDFFormFields[i];
// get the value input in the FORM for the specified field
val = Trim(FORM[field.formFieldName]);
if (IsCustomFunction(field.formatFunction))
val = field.formatFunction(field.type, val);
}
这适用于所有其他字段(格式化电话号码、日期、时间等)。只有在包含该一个条件时才会出错。
更新:
这个异常实际上是从另一个循环中抛出的,我正在尝试用值填充 PDF 表单:
<cfpdfform
source="myPDF.pdf"
action="populate"
destination="newPDF.pdf"
overwrite="yes"
overwritedata="yes">
<cfloop array="#THIS.aPDFFormFields#" index="field">
<cfpdfformparam
name="#field.name#"
value="#getFormattedFieldValue(FORM, field)#" />
</cfloop>
</cfpdfform>
<cffunction name="getFormattedFieldValue" returntype="string" output="false">
<cfargument name="fieldValues" type="Struct" required="true" />
<cfargument name="field" type="Field" required="true" />
<cfscript>
var fieldValue = "";
if (StructKeyExists(ARGUMENTS.fieldValues, fieldname))
fieldValue = ARGUMENTS.fieldValues[fieldName];
if (IsCustomFunction(field.formatFunction))
fieldValue = field.formatFunction(fieldValue);
if (!Len(fieldValue))
fieldValue = " ";
return fieldValue;
</cfscript>
</cffunction>
看不到 CFLOOP 在数组上会如何引发 ArrayOutofBounds 异常。我没有在这个逻辑的任何地方引用索引!
【问题讨论】:
-
你在哪一行得到错误?我在我的 CF8 实例上运行了这个,并且没有得到任何长度的字符串的错误,所有类型的。你是如何调用函数的?
-
它没有给我行号。堆栈跟踪仅显示“java.lang.ArrayIndexOutOfBounds”。我一直在删除行,直到我不再收到错误为止。
-
您可以在原始帖子中发布整个堆栈跟踪吗?您还应该确保在 CF Admin 中打开了强大的异常,以便我们确保我们拥有所有信息。
-
同上 - 这在我的 CF9 上运行良好,您尝试在 else if 语句中分配给“文本”的实际值是多少?另外-这是实际的代码吗?您说返回字符串是从参数“构建”的,但是您在此处拥有的返回值是对 arg 的替换。我本来希望看到类似 text = text&" some new string";
-
我感觉 OP 可能在循环这些函数调用(可能循环在一个数组上?)并且那个或类似的东西是问题。
标签: arrays loops coldfusion indexoutofboundsexception