<cfloop condition =“true”>导致最奇怪的错误</cfloop>

时间:2011-10-12 18:46:47

标签: coldfusion coldfusion-8 cfloop

在任何类型的循环中使用任何类型的条件时,我一直在努力解决最奇怪的错误。

我不断得到的错误是:“复杂对象类型无法转换为简单值。”在包含<cfloop condition="true">的行上。甚至更有趣的是<cfbreak>没有突破循环。我在Eclipse中使用了调试器来确认此代码是否已实际执行。

奇怪的是有时候代码会永远循环,即使我知道<cfbreak>被执行了,有时它会在第一次迭代时出错。

我已经确认此问题也发生在另外两台计算机上。

在每个人都对我使用始终真实的条件感到不满之前,我曾经有过一个有效的条件:<cfloop condition="not done">其中done是一个布尔值。这导致了同样的错误。

我正在处理其他人编写的旧代码,因此目前不能重写代码。

我刚刚将ColdFusion 8.0.1修补到最新的更新程序4,看看是否可以解决问题,但事实并非如此。

这就是代码本质上的样子:

<cfloop condition="true">
    <cfif condition is true>
        <cfbreak>
    </cfif>
</cfloop>

以下是执行的代码:

<cfset done = false />
<cfloop condition="true">
    <cfscript>
        try
        {
            lineitem.quantity = quantityRemaining;

            quantityRemaining = 0;

            arrayAppend( currentTub, lineitem );

            currentCartItemCount = currentCartItemCount + lineitem.quantity;
            currentTubItemCount = currentTubItemCount + lineitem.quantity;

        }
        catch(Any e){}


        availableSpaceInCart = this.itemsPerCart - currentCartItemCount;
        availableSpaceInTub = this.itemsPerTub - currentTubItemCount;
    </cfscript>

    <cfif quantityRemaining LTE 0>
        <cfset done = true />
        <cfbreak />
    </cfif>
</cfloop>

更新:

我们弄清楚问题是什么。此循环周围有两个<CFOUTPUT>标记,外部<CFOUTPUT query='query_name' groupby='column_name'>标记使用QueryNew()生成的查询,由于某种原因,ColdFusion不喜欢。所以我们解决了这个问题,它解决了我们的奇怪问题。

4 个答案:

答案 0 :(得分:2)

您将不明确的值传递给条件循环。

当你写:

<cfloop condition="x">

你告诉ColdFusion:只要'x'的计算结果为true,就继续循环。这可能是一个像(myvar gte 10)这样的语句,如果myvar大于或等于10,它将评估为真。如果循环中的某些机制减少myvar,最终,通过循环将导致它停止,因为myvar将不再大于或等于10(已降至10以下)。

现在,让我们来看看你的情况:

<cfloop condition="true">

CF是否将其视为:

<cfif 'true'>

或者

<cfif TRUE>

如果您写入ColdFusion语句,那么肯定是错误的,并且会抛出错误。您可能会发现无法将“字符串”评估为布尔值TRUE或FALSE评估。我几乎可以肯定,解析字符串值会使ColdFusion与实际的布尔值TRUE或FALSE值混淆。也许这种将“true”的词汇转换为TRUE会导致与对象相关的错误。你想要的,更有可能是:

因为done的值设置为FALSE以启动,当与逻辑NOT结合使用时,其值为true。

然后,在你的陈述之后:

   <cfif quantityRemaining LTE 0>
        <cfset done = true />
   </cfif>

不需要<cfbreak>语句,它会强行将您排除在循环之外。如果你有条件地循环,那么对该变量的评估将影响循环的迭代(读取:它将停止它)。

此外,您可能希望将您的病情改为:

<cfloop condition="quantity LTE 0">

并且根本不需要完成变量。

答案 1 :(得分:1)

如果quantityRemaining的值达到0或更低,您的代码似乎想要突破循环。那么为什么不将它用作cfloop中的条件,而不是使用'true'。然后你可以删除cfbreak块,因为这基本上就是cfloop条件正在做的事情。

<cfset quantityRemaining = 5>
<cfloop condition="quantityRemaining GT 0">
    <!--- your code here --->
    <cfoutput>#quantityRemaining#<br></cfoutput>

    <!--- don't forget to change the value, otherwise you'll loop forever --->
    <cfset quantityRemaining = quantityRemaining - 1>
</cfloop>

答案 2 :(得分:1)

错误“复杂对象类型无法转换为简单值。”就是指。

复杂对象 - 对象,数组,结构,查询等 - 无法转换为简单值 - 字符串,数字,日期,布尔值等 - 因为没有全球定义的方式。

根据您发布的代码,这些变量中至少有一个不具有简单值:

  • currentCartItemCount
  • currentTubItemCount
  • lineitem.quantity
  • this.itemsPerCart
  • this.itemsPerTub
  • quantityRemaining

要找出哪一个,请将它放在循环之前:

<cfdump var=#isSimpleValue(currentCartItemCount)# />
<cfdump var=#isSimpleValue(currentTubItemCount)# />
<cfdump var=#isSimpleValue(lineitem.quantity)# />
<cfdump var=#isSimpleValue(this.itemsPerCart)# />
<cfdump var=#isSimpleValue(this.itemsPerTub)# />
<cfdump var=#isSimpleValue(quantityRemaining)# />
<cfabort/>

如果有任何输出false(或no),则打开isSimpleValue函数以找出它包含的内容并向后追踪代码以找出原因。

如果您获得了true(或yes)六次,那么其他内容正在进行,您可能需要共享更多代码。

答案 3 :(得分:0)

<cfloop condition="true">

相同
<cfloop condition=true>

正如<cfif 'true'><cfif true>

相同

你基本上设置的是无限循环,因为你的条件总是如此。如果你的代码永远不会破坏,你就会遇到严重问题。

您可能希望执行以下操作,并从循环中删除<cfbreak>

<cfloop condition="quantityRemaining GT 0">