具有@NotNull/@ Nullable支持的Actionscript 3静态分析器

Ily*_*sov 4 flash actionscript static-analysis actionscript-3

我想使用静态分析来防止"TypeError:错误#1009:无法访问空对象引用的属性或方法".

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

我想知道ActionScript 3是否有免费的工具?

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

所以问题是:

  1. ActionScript 3有静态分析器吗?
  2. 如果它不是免费的,它会花多少钱?
  3. 是否有任何其他解决方案可以防止1009错误,除了"检查所有内容并将您的代码变成一团糟".

更新

没有给出完整的答案:(但是到目前为止,weltraumpirat的答案是最好的.我考虑使用可空函数的命名约定:尝试*,查找*,*OrNull,*IfAny等名称变得更长但可靠性更重要谢谢weltraumpirat!赏金是你的,但是我不会将答案标记为'已接受',因为它没有完整,我希望有时会有人回答所需的静态分析器链接:)

wel*_*rat 6

据我所知,ActionScript没有静态分析工具可以实际防止空引用错误 - AS是一种动态语言,而且很多使它成为优秀语言的东西发生在编译器之外(或静态分析)工具,就此而言)可以验证.

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

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

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

function myMethod( something:* ) : void {
    if ( something != null) {
       doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是,不是抛出错误(这将使您能够找到发生崩溃的方法和行号的名称,以便追踪问题),程序将继续运行,但没有发生.现在,当您执行手动测试时,您将看到:什么都没有.而且没有迹象表明出了什么问题.

处理空引用的更好方法是

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

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

    function getPropertyValue() : String { 
        return _property != null ? _property : "";
    }
    
    Run Code Online (Sandbox Code Playgroud)

    当然,默认值可能是有意义的,例如"Property did not have a value.",因此在您的UI中,您会立即注意到问题,而不会影响程序的其余部分.(请注意,这不仅适用于getter,而且适用于任何返回值的方法 - 我只是选择了一个明显的例子.)

    如果由于某种原因你真的无法绕过返回null,请确保你的方法名称反映了这一点,所以当你使用它时,你知道期望可能的空值:

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

    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.");
    }
    
    Run Code Online (Sandbox Code Playgroud)

    应该捕获有意义的错误并将其转发到日志或调试控制台,以便您始终知道在哪里查找原因,并了解您需要做些什么来解决它.