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

アップデート:

関数を呼び出す方法は次のとおりです....「フィールド」の配列があります。配列内の各「フィールド」オブジェクトには、別の場所で設定されるいくつかのプロパティがあります。これらのプロパティの 1 つが「formatFunction」です。一部のフィールドには、「formatPhone」や「formatDate」などの formatFunction 値があり、これらはフィールド オブジェクト内の関数の名前です。

フィールド.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);
}

これは、他のすべてのフィールド (電話番号、日付、時刻などの書式設定) で機能します。その1つの条件が含まれている場合にのみエラーになります。

アップデート:

この例外は、実際には別のループからスローされています。ここでは、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>

上記のコメントでジェイソンが提案したように、そこに try/catch を配置し、配列内のどのオブジェクトがエラーを引き起こしているかを突き止め、正しく機能するために必要な情報が欠落していないかどうかを確認します。物事を消化しやすい部分に分解すると、エラーを突き止めることができます。

于 2011-09-07T16:54:30.190 に答える