在任何类型的循环中使用任何类型的条件时,我一直在努力解决最奇怪的错误。
我不断得到的错误是:“复杂对象类型无法转换为简单值。”在包含<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不喜欢。所以我们解决了这个问题,它解决了我们的奇怪问题。
答案 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)
错误“复杂对象类型无法转换为简单值。”就是指。
复杂对象 - 对象,数组,结构,查询等 - 无法转换为简单值 - 字符串,数字,日期,布尔值等 - 因为没有全球定义的方式。
根据您发布的代码,这些变量中至少有一个不具有简单值:
要找出哪一个,请将它放在循环之前:
<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">