【问题标题】:Flash Actionscript 3 Bug? Using an int and negative numbers in a switch/caseFlash Actionscript 3 错误?在 switch/case 中使用 int 和负数
【发布时间】:2013-01-23 14:48:30
【问题描述】:

运行此代码

var myValue1:int = 2;
switch (myValue1)
{
    case -3: trace(myValue1 + " == -3"); break;
    case -2: trace(myValue1 + " == -2"); break;
    case -1: trace(myValue1 + " == -1"); break;
    case 0:  trace(myValue1 + " == 0"); break;
    case 1:  trace(myValue1 + " == 1"); break;
    case 2:  trace(myValue1 + " == 2"); break;
    case 3:  trace(myValue1 + " == 3"); break;
    default: trace(myValue1 + " is unknown"); break;
}

var myValue2:int = -2;
switch (myValue2)
{
    case -3: trace(myValue2 + " == -3"); break;
    case -2: trace(myValue2 + " == -2"); break;
    case -1: trace(myValue2 + " == -1"); break;
    case 0:  trace(myValue2 + " == 0"); break;
    case 1:  trace(myValue2 + " == 1"); break;
    case 2:  trace(myValue2 + " == 2"); break;
    case 3:  trace(myValue2 + " == 3"); break;
    default: trace(myValue2 + " is unknown"); break;
}

给出这个输出:

2 == 0 -2 未知

(在 Flash Builder 4.7.0.349722 中编译,在 Flash 11.5.502.149 上运行。在 Windows 7 SP1、Firefox 18.0.2 中运行)

以下更改都解决了上述问题,并给出了正确的输出:

  • 将值类型更改为Number
  • 删除负数 case 语句。
  • case 语句更改为使用 int-variables 而不是 literals...除非这些变量也是 const,在这种情况下它会保留坏了!

更改 myValue2 = -1 会得到输出 -1 == -3,这同样是 wtf-ish。


显然这是一个错误,但是……是什么原因造成的?在我不理解的案例陈述中使用int 或负数是否有一些细微差别?我的代码有什么错误吗?或者这仅仅是 Flash Builder 中字节码编译器的问题?

【问题讨论】:

  • 发布的代码在 Flash CS5 和 FB4.7 中对我来说可以正常工作。输出:2 == 2 -2 == -2
  • 我没有答案,但我经常做这样的事情,而不是一堆 if/else 语句switch (true) { case someBooleanExpression: break; case someOtherExpression: break; } 我认为这种行为的答案在于某种东西被强制/被视为布尔值。但我不能给出明确的答案,我相信其他人会:)
  • 有趣。仅供参考,我在为 AIR 3.4 构建的 Flash Builder 4.7 中得到了相同的结果(我猜是使用 Flash Player 11.4)。但是,它在为 Flash Player 9、10.3、11.1、11.2、11.3 和 11.4 编译的 Flash Professional CS6 中跟踪 2 == 2-2 == -2
  • Flash CS5: 2 == 2 and -2 == -2 MiniBuilder 2 == 2 and -2 == -2 wonderfl.net 2 == 2 and -2 == -2
  • 要确定是 Flash Player 错误还是编译器错误,请尝试更改每个版本的版本以确定问题的根源。如果编译器被指控,您可以尝试使用 SWFInvestigator 之类的工具来查看输出字节码(以及它有什么问题)。

标签: actionscript-3 flash debugging actionscript flash-builder


【解决方案1】:

我认为您不会找到这个问题的具体答案。 我可以提供的是对 AS3 编译器错误的确认。 我花了很长时间试图解决类似的“神奇”错误,结果却一无所获。 一个这样的例子是 For 和 While 循环在没有明显原因的情况下跳过数组中的第一项或最后一项,而 Foreach 循环工作得很好。

对我来说,最合理的原因是内存管理中的错误。 这也可能与硬件有关,因为在我或我的同事工作的某些机器上发生此类事情的频率更高。 我认为满足了一些“不可见”的条件,例如执行操作的顺序(您可以尝试在 var 声明和开关之间放置一些虚拟代码,或者可能多次分配 var 值,只是为了“慢跑内存”)与容易出错的编译器相结合会弄乱内存寻址并且您的开关认为它是两个整数,而实际上它从内存中获得了不同的值。

【讨论】:

    【解决方案2】:

    您可能可以通过将原始值转换为字符串并将您的案例转换为字符串值来强制编译器进行操作。

    switch( String(value) )
    {
       case "-3": /*do something*/; break;
       case "-2": /*do something*/; break;
       case "-1": /*do something*/; break;
       case  "0": /*do something*/; break;
       case  "1": /*do something*/; break;
       case  "2": /*do something*/; break;
       case  "3": /*do something*/; break;
       default: break;
    }
    

    【讨论】:

    • 我已经提到了几种可以修复它的方法,但这与问题无关。
    【解决方案3】:

    这只是 Flash Builder 中字节码编译器的一个问题。

    显然,您的语法很好;可追溯到 2005 年的编译器确实存在数百个已知问题,这些问题仍然存在或未解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多