Почему длинная строка вызывает исключение ArrayIndexOutOfBounds в ColdFusion 8? - PullRequest
1 голос
/ 07 сентября 2011

У меня есть функция, которая возвращает строковое значение, построенное из статического текста и переданных аргументов:

<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.

Когда я укорачиваю строку, исключение не возникает. У меня действительно нет варианта здесь - мне нужна полная строка.

Почему это происходит, и что более важно, что я могу сделать, чтобы это исправить?

UPDATE:

Я только что попытался вызвать функцию из другого места, и она отлично работает:

<cfscript>
    function getIt(type, val){
        return additionalText(type, val);
    }

    x.func = getIt;
</cfscript>

<cfdump var="#x.func("A", "XXXX")#" />

Смущает сейчас ...

UPDATE:

Вот полный текст исключения ColdFusion с включенным Robust Exception:

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

UPDATE:

Вот как я вызываю функцию .... У меня есть массив "полей". Каждый «полевой» объект в массиве имеет несколько свойств, которые установлены в другом месте. Одним из этих свойств является «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);
}

Это работает для всех других полей (форматирование телефонных номеров, дат, времени и т. Д.). Это только ошибки, когда это одно условие включено.

UPDATE:

Это исключение фактически выдается из другого цикла, где я пытаюсь заполнить 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. Я нигде не ссылаюсь на индексы в этой логике!

Ответы [ 3 ]

1 голос
/ 07 сентября 2011

Ошибка ArrayIndexOutOfBounds возникает при попытке обратиться к элементу массива, который находится за пределами определенного массива.Например, у вас есть массив с 5 элементами, и вы запрашиваете элемент массива 7, вы получаете ошибку.

Ваша функция возвращает строку, я не понимаю, как это может быть причиной ошибки.Все, что вызывает эту функцию, скорее всего, является причиной ошибки.

0 голосов
/ 08 сентября 2011

Как выясняется, причина этого исключения, столь же загадочного, в том, что я пытался установить поле флажка формы PDF с этой длинной строкой, и оно не могло принять значение.Я попросил Администратора PDF соответствующим образом обновить PDF, чтобы мы могли правильно обновлять его при необходимости.

0 голосов
/ 07 сентября 2011

Вам нужно начать тестировать вещи изолированно, чтобы понять, что происходит.Я запустил следующий тест с использованием вашего 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>

Как предложил Джейсон в комментариях выше, поместите туда попытку / улов и выясните, какой объектМассив вызывает ошибку, и посмотрите, может быть, ему не хватает необходимой информации, чтобы все работало правильно.Разбейте вещи на легкоусвояемые кусочки, и вы обнаружите ошибку.

...