静的テキストと渡された引数から構築された文字列値を返す関数があります。
<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 例外をスローする方法がわかりません。このロジックのどこにもインデックスを参照していません!