我想使用静态分析来防止“ TypeError:错误#1009:无法访问空对象引用的属性或方法”。
据我所知,有一个使用@ NotNull / @ Nullable的Java静态分析器。程序员通过为每个成员/函数/自变量指定这些注释来明确表达其意图,以便工具可以验证是否所有内容都正确,并且每个@Nullable-> @NotNull转换都将检查是否为null。对我来说,只指定@Nullable会比较舒服,这样其他所有内容都可以像@NotNull一样对待,但这不是必需的。
我想知道是否有针对Actionscript 3的免费工具?
我拥有FlashBuilder 4.5许可证,但除此之外,我不愿购买其他任何产品。我听说IntelliJ IDEA可能有这样的事情,但它只能与非免费的Ultimate Edition中的Actionscript配合使用:(
所以问题是:
ActionScript 3是否有这种静态分析器?
如果不是免费的,它将花费多少?
除了“检查所有内容并将您的代码转换成乱七八糟的东西”之外,是否还有其他防止1009错误的解决方案。
更新资料
没有给出完整的答案:(但是weltraumpirat的答案是迄今为止最好的。我考虑对可为空的函数使用命名约定:Try *,Find *,* OrNull,* IfAny等。名称变得更长,但是可靠性更重要。谢谢您好!悬赏是您的,但我不会将答案标记为“已接受”,因为它还不完整,我希望有时有人会通过指向所需静态分析器的链接进行回答:)
最佳答案
据我所知,没有用于ActionScript的静态分析工具实际上可以防止null引用错误-AS是一种动态语言,很多使它成为好语言的原因是编译器之外(或静态分析)工具)可以验证。
但是,您可以并且应该做的是,设计代码的方式是首先避免空引用,并允许有意义的错误消息来帮助您更快地发现错误。
这样想:如果某个变量实例在某个时刻不应该为null,那么是否应该允许该程序运行?在大多数情况下,答案显然是:不,不应该!
例如,不是防止空引用,一个常见的错误是在程序的每个可能的点添加空检查,如下所示:
function myMethod( something:* ) : void {
if ( something != null) {
doStuff();
}
}
这样做的结果是,该程序将继续运行,而不是抛出错误(使您能够查找发生崩溃的方法的名称和行号,以便跟踪问题),而不是抛出错误。发生。现在,当您执行手动测试时,您将看到:什么都没有。而且不会有任何错误的迹象。
处理空引用的一种更好的方法是
确保所有方法都不返回null。曾经
这可以通过返回默认值来实现,例如:
function getPropertyValue() : String {
return _property != null ? _property : "";
}
当然,默认值可能是有意义的值,例如
"Property did not have a value."
,因此在您的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.");
}
应该捕获有意义的错误,并将其转发到日志或调试控制台,以便您始终知道在哪里寻找原因,并了解如何解决该问题。