Actionscript 3 Actionscript 3静态分析器,支持@NotNull/@Nullable
我希望使用静态分析来防止“TypeError:Error#1009:无法访问null对象引用的属性或方法” 据我所知,有一个Java静态分析器使用@NotNull/@Nullable。程序员通过为每个成员/函数/参数指定这些注释来明确表达他的意图,这样工具就可以验证所有内容是否正确,并且每个@Nullable->@NotNull转换都是通过检查null来完成的。对我来说,只指定@Nullable会更舒服,这样其他所有内容都可以像@NotNull一样处理,但这不是必需的 我想知道是否有用于ActionScript3的免费工具 我有FlashBuilder 4.5许可证,但除此之外,我不想购买任何其他产品。我听说IntelliJ IDEA可能有这样一个功能,但它只适用于Ultimate Edition中的Actionscript,它不是免费的:( 因此,问题是: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
没有给出完整的答案:(但是,<>强> 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."); }
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
{
}
}