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,它不是免费的:(
没有给出完整的答案:(但是到目前为止,weltraumpirat的答案是最好的.我考虑使用可空函数的命名约定:尝试*,查找*,*OrNull,*IfAny等名称变得更长但可靠性更重要谢谢weltraumpirat!赏金是你的,但是我不会将答案标记为'已接受',因为它没有完整,我希望有时会有人回答所需的静态分析器链接:)
据我所知,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)
应该捕获有意义的错误并将其转发到日志或调试控制台,以便您始终知道在哪里查找原因,并了解您需要做些什么来解决它.
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |