我有一个函数,它返回从静态文本构建的字符串值并传递参数:
<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”,它们是字段对象中的函数名称:
字段.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 异常。我没有在这个逻辑的任何地方引用索引!