编辑3:好吧,我正在点亮Windows Server 2008 R2虚拟机,安装Flex Builder 3,看看我是否可以获得一个新项目来正确编译和执行。 新闻!我在虚拟机中启动并运行了IDE,并且 STILL 在代码编译后没有出现同样的错误!这里出现了一个重要的,强烈的“强大的双重效果”。
编辑2:由于这已经是一个很长的帖子,我会把它放在这里。我刚刚完成并单独删除了两个问题行的每一部分,并尝试在每一行之后进行编译,每次都得到错误。我甚至删除了两个DataGridColumn
中的所有内容,而仍然没有编译,即使注释掉两个空的<mx:DataGridColumn />
行也会让程序加载!这让我疯了,任何人都可以为我解释这个问题吗?
/编辑2
我有一个AIR应用程序,当我点击F5时显然可以正常编译,但在应用程序有机会加载之前我得到以下错误:
通过注释掉代码块,我将问题缩小到两个特定的行。
<mx:DataGrid id="grid1" width="100%" height="100%" editable="false">
<mx:columns>
<mx:DataGridColumn headerText="Symbol" dataField="Symbol" headerWordWrap="true" width="100" textAlign="left"/>
<mx:DataGridColumn headerText="Description" dataField="FullName" headerWordWrap="true" width="150" textAlign="left"/>
<mx:DataGridColumn headerText="Trans" dataField="TransactionCode" headerWordWrap="true" width="75" textAlign="center"/>
<mx:DataGridColumn headerText="Quantity" dataField="Quantity" headerWordWrap="true" width="50" textAlign="right" labelFunction="formatUtil3"/>
<mx:DataGridColumn headerText="Execution Date" dataField="ExecutionDate" headerWordWrap="true" width="80" textAlign="center"/>
<mx:DataGridColumn headerText="Execution Price" dataField="ExecutionPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank1" headerText=""/>
<mx:DataGridColumn headerText="Previous Business Day" dataField="PreviousDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="PD5"/>
<!----> <mx:DataGridColumn headerText="Previous Business Day Price" dataField="PreviousDatePrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="PD5"/>
<!----> <mx:DataGridColumn headerText="% Difference" dataField="PreviousDateDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="PD5"/>
<mx:DataGridColumn headerText="Source" dataField="PreviousDateSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="PD5"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank2" headerText=""/>
<mx:DataGridColumn headerText="Previous Month End" dataField="PrevMonthEndDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="PME5"/>
<mx:DataGridColumn headerText="Previous Month End Price" dataField="PrevMonthEndPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="PME5"/>
<mx:DataGridColumn headerText="% Difference" dataField="PrevMonthEndDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="PME5"/>
<mx:DataGridColumn headerText="Source" dataField="PrevMonthEndSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="PME5"/>
</mx:columns>
</mx:DataGrid>
这两行标有<!---->
。如果我评论这两行,那么应用程序将正确编译,运行和显示,但如果我让其中任何一个处于活动状态,我会得到上面的错误。
这里发生了什么?
修改:根据要求提供其他代码 -
<mx:CurrencyFormatter id="format1" precision="5" useNegativeSign="false"/>
<mx:NumberFormatter id="format2" precision="2"/>
功能 -
private function formatUtil1(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format1.format(Field);
}
private function formatUtil2(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format2.format(Field);
}
接下来是PD5的.as文件 -
package
{
import mx.controls.Label;
import mx.controls.listClasses.*;
public class PD5 extends Label
{
private const POSITIVE_COLOR:uint = 0x000000; // Black
private const NEGATIVE_COLOR:uint = 0xFF0000; // Red
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
setStyle("color", (data.PreviousDateDelta >= 5 || data.PreviousDateDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
}
}
}
现在PME5.as -
package
{
import mx.controls.Label;
import mx.controls.listClasses.*;
public class PME5 extends Label
{
private const POSITIVE_COLOR:uint = 0x000000; // Black
private const NEGATIVE_COLOR:uint = 0xFF0000; // Red
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
setStyle("color", (data.PrevMonthEndDelta >= 5 || data.PrevMonthEndDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
}
}
}
答案 0 :(得分:3)
以调试模式运行应用程序。出现错误时,Flex构建器(Flash Builder 4.5是最新版本)将断开并带您进入导致问题的代码行。这是因为您尝试访问其属性的某个对象实际上是null。
您可以在调试窗口(窗口菜单&gt; debug)中上下调用调用树,这样您就可以找出哪个对象为null。
大多数情况下会发生这种情况,因为数据提供者不完整,即缺少某些数据。例如,一行可能没有前一天的商业价格。如果是这种情况,那么您需要处理formatUtil函数
中的null项var field:Object=item[column.dataField];
if(field!=null) {
return format1.format(field);
} else {
return "";
}
编辑:
还要检查以下两行:
setStyle("color", (data.PrevMonthEndDelta >= 5 || data.PrevMonthEndDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
和
setStyle("color", (data.PreviousDateDelta >= 5 || data.PreviousDateDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
错误可能来自data.PreviousDateDelta
或data.PrevMonthEndDelta
答案 1 :(得分:0)
代码中没有什么是坏的
显然,这是未经测试的代码
我感觉你的数据提供者没有完整或缺少数据。
可能是由于其中一条线。
// no validation is being done so this can be a failure point
var Field:Object = item[column.dataField];
return format1.format(Field);
return format2.format(Field);
以下是您可以尝试测试数据提供者的一些代码
import flash.debugger.enterDebugger;
private function formatUtil1(item:Object, column:DataGridColumn):String
{
try{
if (item[column.dataField] ){
var Field:Object = item[column.dataField];
var retVal:String = format1.format(Field)
if( retVal == null || retVal == undefined ){
//return '';
enterDebugger()
}
}else{
//return '';
enterDebugger()
}
}catch(e:error){
//return '';
enterDebugger()
}
return retVal;
}
private function formatUtil2(item:Object, column:DataGridColumn):String
{
try{
if (item[column.dataField] ){
var Field:Object = item[column.dataField];
var retVal:String = format2.format(Field);
if( retVal == null || retVal == undefined ){
//return '';
enterDebugger()
}
}else{
//return '';
enterDebugger()
}
}catch(e:error){
//return '';
enterDebugger()
}
return retVal;
}
同样的事情可以应用于渲染器
package
{
import mx.controls.Label;
import mx.controls.listClasses.*;
public class PME5 extends Label
{
private const POSITIVE_COLOR:uint = 0x000000; // Black
private const NEGATIVE_COLOR:uint = 0xFF0000; // Red
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
// are you 100% sure data.PrevMonthEndDelta exists on the data object????
if (data != null && data.PreviousDateDelta ){
setStyle("color", (data.PrevMonthEndDelta >= 5 || data.PrevMonthEndDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
}
}
}
}
答案 2 :(得分:0)
这里编译好。没有更改任何内容,只添加了默认数据。
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
private function formatUtil1(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format1.format(Field);
}
private function formatUtil2(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format2.format(Field);
}
private function formatUtil3(item:Object, column:DataGridColumn):String
{
return formatUtil2(item, column);
}
]]>
</fx:Script>
<fx:Declarations>
<mx:NumberFormatter id="format2" precision="2"/>
<mx:CurrencyFormatter id="format1" precision="5" useNegativeSign="false"/>
</fx:Declarations>
<mx:DataGrid id="grid1" width="100%" height="100%" editable="false">
<mx:ArrayCollection>
<mx:source>
<fx:Object
Symbol="€"
FullName="Name"
TransactionCode="121345"
Quantity="10"
ExecutionDate="10.10.2011"
ExecutionPrice="1.5"
PreviousDate="09.10.2011"
PreviousDatePrice="1.4"
PreviousDateDelta="10"
PreviousDateSource="0.1"
PrevMonthEndDate="0.1"
PrevMonthEndPrice="0.1"
PrevMonthEndDelta="-10"
PrevMonthEndSource="0.1"
/>
<fx:Object
Symbol="€"
FullName="Name2"
TransactionCode="121345"
Quantity="10"
ExecutionDate="10.10.2011"
ExecutionPrice="1.5"
PreviousDate="09.10.2011"
PreviousDatePrice="1.4"
PreviousDateDelta="4"
PreviousDateSource="0.1"
PrevMonthEndDate="0.1"
PrevMonthEndPrice="0.1"
PrevMonthEndDelta="4"
PrevMonthEndSource="0.1"
/>
</mx:source>
</mx:ArrayCollection>
<mx:columns>
<mx:DataGridColumn headerText="Symbol" dataField="Symbol" headerWordWrap="true" width="100" textAlign="left"/>
<mx:DataGridColumn headerText="Description" dataField="FullName" headerWordWrap="true" width="150" textAlign="left"/>
<mx:DataGridColumn headerText="Trans" dataField="TransactionCode" headerWordWrap="true" width="75" textAlign="center"/>
<mx:DataGridColumn headerText="Quantity" dataField="Quantity" headerWordWrap="true" width="50" textAlign="right" labelFunction="formatUtil3"/>
<mx:DataGridColumn headerText="Execution Date" dataField="ExecutionDate" headerWordWrap="true" width="80" textAlign="center"/>
<mx:DataGridColumn headerText="Execution Price" dataField="ExecutionPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank1" headerText=""/>
<mx:DataGridColumn headerText="Previous Business Day" dataField="PreviousDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn headerText="Previous Business Day Price" dataField="PreviousDatePrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn headerText="% Difference" dataField="PreviousDateDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn headerText="Source" dataField="PreviousDateSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank2" headerText=""/>
<mx:DataGridColumn headerText="Previous Month End" dataField="PrevMonthEndDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="tmp.PME5"/>
<mx:DataGridColumn headerText="Previous Month End Price" dataField="PrevMonthEndPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="tmp.PME5"/>
<mx:DataGridColumn headerText="% Difference" dataField="PrevMonthEndDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="tmp.PME5"/>
<mx:DataGridColumn headerText="Source" dataField="PrevMonthEndSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="tmp.PME5"/>
</mx:columns>
</mx:DataGrid>
</s:Application>
答案 3 :(得分:0)
由于到目前为止还没有解决我的问题,我决定完全回避它并将有问题的程序移植到C#。到目前为止它运作良好的一切。
懒惰的回答?是的。
懒惰的解决方案?不幸的是没有。