Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Actionscript 3静态分析器,支持@NotNull/@Nullable_Actionscript 3_Flash_Actionscript_Static Analysis - Fatal编程技术网

Actionscript 3 Actionscript 3静态分析器,支持@NotNull/@Nullable

Actionscript 3 Actionscript 3静态分析器,支持@NotNull/@Nullable,actionscript-3,flash,actionscript,static-analysis,Actionscript 3,Flash,Actionscript,Static Analysis,我希望使用静态分析来防止“TypeError:Error#1009:无法访问null对象引用的属性或方法” 据我所知,有一个Java静态分析器使用@NotNull/@Nullable。程序员通过为每个成员/函数/参数指定这些注释来明确表达他的意图,这样工具就可以验证所有内容是否正确,并且每个@Nullable->@NotNull转换都是通过检查null来完成的。对我来说,只指定@Nullable会更舒服,这样其他所有内容都可以像@NotNull一样处理,但这不是必需的 我想知道是否有用于Acti

我希望使用静态分析来防止“TypeError:Error#1009:无法访问null对象引用的属性或方法”

据我所知,有一个Java静态分析器使用@NotNull/@Nullable。程序员通过为每个成员/函数/参数指定这些注释来明确表达他的意图,这样工具就可以验证所有内容是否正确,并且每个@Nullable->@NotNull转换都是通过检查null来完成的。对我来说,只指定@Nullable会更舒服,这样其他所有内容都可以像@NotNull一样处理,但这不是必需的

我想知道是否有用于ActionScript3的免费工具

我有FlashBuilder 4.5许可证,但除此之外,我不想购买任何其他产品。我听说IntelliJ IDEA可能有这样一个功能,但它只适用于Ultimate Edition中的Actionscript,它不是免费的:(

因此,问题是:
  • ActionScript3有这样的静态分析器吗
  • 如果不是免费的,要多少钱
  • 除了“检查所有内容并将代码转换为一团乱麻”之外,还有其他解决方案可以防止1009错误吗
  • 更新
    没有给出完整的答案:(但是,<>强> WelthPurrase的答案是最好的。我认为使用命名约定可用于空函数:尝试*,查找*,* OrNull,*IFANE等等。名称变得更长,但可靠性更重要。谢谢您WelthPurPATH!赏金是您的,但我不会把答案标记为“接受”,因为它不是满的,我希望在某个时候某某。ody将通过一个指向所需静态分析器的链接来回答:)

    据我所知,ActionScript没有一个静态分析工具能够真正防止空引用错误——正如动态语言一样,很多使它成为一种好语言的因素都发生在编译器(或静态分析工具)之外可以验证

    但是,您可以而且应该做的是,首先以一种防止空引用的方式设计代码,并允许有意义的错误消息帮助您更快地发现错误

    可以这样想:如果变量实例在某一点不应该为null,那么程序是否应该允许运行?在大多数情况下,答案显然是:不,它不应该

    例如,一个常见的错误不是防止空引用,而是在程序中的每个可能点添加空检查,如下所示:

    function myMethod( something:* ) : void {
        if ( something != null) {
           doStuff();
        }
    }
    
    这样做的结果是,不会抛出错误(这将使您能够找到发生崩溃的方法名称和行号,以便跟踪问题),程序将继续运行,但什么也不会发生。现在,当您执行手动测试时,您将看到:什么也没有。并且不会显示出出现了什么问题

    处理空引用的更好方法是

    • 确保没有任何方法返回null

      这可以通过返回默认值来实现,例如:

      function getPropertyValue() : String { 
          return _property != null ? _property : "";
      }
      
      当然,默认值可能是有意义的,例如
      “属性没有值。”
      ,这样在UI中,您可以立即注意到问题,而不会影响程序的其余部分。(请注意,这不仅适用于getter,而且适用于任何返回值的方法-我只是选择了一个明显的示例。)

      如果由于某种原因确实无法绕过返回null,请确保方法名称反映了这一点,以便在使用它时,您知道可能会出现null值:

       function getPropertyValueOrNull() : String {
           return _property;
       }
      
    • 在应用程序的关键点创建验证方法,并抛出有意义的错误以指出问题的原因,而不是无用的空检查:

      function tryExecuteImportantFunction() : void {
          try {
               validate();
               executeImportantFunction();
          } catch ( e:Error ) {
               trace( "Validation failed:" + e.message );
          }
      }
      
      function validate() : void {
          if (_requiredProperty1 == null) 
              throw new Error ( "_requiredProperty1 was null, but should always contain a string value.");
          if (_requiredProperty2 == null) 
              throw new Error ( "_requiredProperty2 was null, but should always contain a dictionary.");
      }
      
      应该捕获有意义的错误并将其转发到日志或调试控制台,以便您始终知道在何处查找原因,并了解如何修复它


    在这种情况下,最有用的应该是getter和setter:

    protected var _value:Object;
    
    public function get value():Object{
        if(_value){
            return _value;
        }
        trace("missing object");// or throw "missing object error"
        return new Object();
    }
    
    public function set value(v:Object):void {
        _value = v;
    }
    
    编辑:


    另外,空检查的附加内容可能是读取describeType()xml并检查是否存在可访问的值。

    我支持weltraumpirat所说的编程方式,即完全避免空值。然而,根据我的经验,这并不总是可能的。在最近的一个项目中,我们检索并生成了大量改变类型和形状的动态数据

    网络超时、回调退出和任何其他意外情况都会导致nulls停止应用程序。我们知道null错误并不严重,并且在很多情况下都会出现

    这就需要对游戏中的所有错误案例进行动态错误处理。try-catch语句要么太慢,要么需要大量维护。Flash Player提供了一种处理方法,尽管它可能不是解决所有问题集的最合适的解决方案。这就是“UncaughtErrorEvent”在Flash Player 10.1发布后引入

    此外,还有一个非常好的库可以处理这个问题。这里:

    最后,如果你看一下Flash Player开发的未来路线图,你会注意到静态类型、重载和lotsa将给平台带来巨大的变化。但现在,这是我使用过的最好的解决方案


    您也可以尝试FlexPMD。它与Java的PMD密切相关,通过应用规则可以在源代码中找到气味

    Adobe将其作为开源发布,您可以从sourceforge获得:

    下面是一个小的介绍视频:


    据我所知,它可以很容易地与Flex Builder集成,但也应该与其他IDE(如IntelliJ和FDT)甚至命令行一起使用。

    gui编程的问题是,总是存在某种状态。所描述的问题基本上是有有效和无效状态。作为一名经验丰富的Flex开发人员
    package net.icodeapps.examples.model
    {
      public class User
      {
      }
    }
    
    package net.icodeapps.examples.model
    {
      public class DefaultUser extends User
      {
      }
    }