1

我有一个函数,它返回从静态文本构建的字符串值并传递参数:

<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 异常。我没有在这个逻辑的任何地方引用索引!

4

3 回答 3

1

当您尝试引用已定义数组边界之外的数组元素时,会发生ArrayIndexOutOfBounds错误。例如,您有一个包含 5 个元素的数组,并且您要求数组元素 7,您会收到错误消息。

您的函数返回一个字符串,我看不出它是如何导致错误的。调用该函数的任何内容很可能是错误的原因。

于 2011-09-07T16:15:37.913 回答
0

事实证明,这个异常的原因虽然很神秘,但我试图用那个长字符串设置一个 PDF 表单复选框字段,它不能接受这个值。我已要求 PDF 管理员相应地更新 PDF,以便我们可以根据需要正确更新它。

于 2011-09-08T17:46:58.013 回答
0

您需要开始孤立地测试事物以弄清楚发生了什么。我使用您的 Field.cfc 运行了以下测试,没有收到任何错误:

<cfset FORM.myFormField = RepeatString("*", 700) />

<cfset BaseObject = createObject("component", "Field") />
<cfset BaseObject.Name = "foo" />
<cfset BaseObject.Type = "C" />
<cfset BaseObject.formFieldName = "myFormField" />
<cfset BaseObject.init() />

<cfset aPDFFormFields = [] />
<cfloop from="1" to="500" index="i">
    <cfset ArrayAppend(aPDFFormFields, Duplicate(BaseObject)) />
</cfloop>

<cfscript>
for (i=1; i<=ArrayLen(aPDFFormFields); i=i+1) {
    field = 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);
        writeOutput(i & ': ' & val & '<br />');
    }
}
</cfscript>

正如 Jason 在上面的评论中建议的那样,在其中放置一个 try/catch,并找出数组中的哪个对象导致了错误,并查看它是否可能缺少一些必需的信息以使事情正常工作。把事情分解成可消化的部分,你就会发现错误。

于 2011-09-07T16:54:30.190 回答