【问题标题】:Why is a long string throwing an ArrayIndexOutOfBounds Exception in ColdFusion 8?为什么在 ColdFusion 8 中长字符串会引发 ArrayIndexOutOfBounds 异常?
【发布时间】: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


【解决方案1】:

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

您的函数返回一个字符串,我不明白它是如何导致错误的。调用该函数的最有可能是错误的原因。

【讨论】:

  • 谢谢,这就是我感到困惑的原因。我知道 ArrayIndexOutOfBounds 是什么意思。我一直在逐行调试这一行,当我删除该行时,异常消失了。这就是为什么我认为这是原因。
  • Try/Catch 刚刚给了我与异常相同的信息:Message [empty string] StackTrace java.lang.ArrayIndexOutOfBoundsException TagContext array [empty] Type java.lang.ArrayIndexOutOfBoundsException
【解决方案2】:

您需要开始孤立地测试事物以弄清楚发生了什么。我使用您的 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 在上面的 cmets 中建议的那样,在其中放置一个 try/catch,并找出数组中的哪个对象导致了错误,并查看它是否可能缺少一些必需的信息以使事情正常工作。把事情分解成易于理解的部分,你就会发现错误。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多