如何避免空对象引用错误

时间:2011-06-21 21:30:57

标签: flex actionscript-3

我有函数init,它运行在应用程序的creationComplete上。 init调用get_login_share_object函数,其中创建了对象,这些对象为null。

现在我的问题是,我在“init()”中的Alert上得到一个空对象引用错误。我怎么能避免这种情况。是否有可能我可以检查一下,如果对象为null,程序应该跳过读取对象。

private function init():void
        {               
            var stored_credentials:Object = get_login_share_object();
            Alert.show(stored_credentials.check_remember +" "+ stored_credentials.alias +" "+ stored_credentials.password );                
        }

        private function get_login_share_object():Object            
        {               
            //create or retrieve the current shared object
            var so:SharedObject = SharedObject.getLocal("loginData","/");       

            var dataToLoad:ByteArray = so.data.ws_creds;
            if(!dataToLoad)
                return null;

            //read in our key
            var aes_key:String = ServerConfig.aes_key;
            var key:ByteArray = new ByteArray();
            key = Base64.decodeToByteArray(aes_key);                 

            //read in our encryptedText
            var encryptedBytes:ByteArray = new ByteArray();
            dataToLoad.readBytes(encryptedBytes);

            //decrypt using 256b AES encryption
            var aes:ICipher = Crypto.getCipher("simple-aes128-ctr", key, Crypto.getPad("pkcs5"));
            aes.decrypt(encryptedBytes);

            encryptedBytes.position = 0;

            var obj:Object = new Object();
            obj.alias = encryptedBytes.readUTF();               
            obj.password = encryptedBytes.readUTF();
            obj.check_remember = encryptedBytes.readUTF();                              

            return obj;
        }

3 个答案:

答案 0 :(得分:3)

您可以像这样检查null:

var stored_credentials:Object = get_login_share_object();
if (stored_credentials)
    Alert.show(stored_credentials.check_remember +" "+ stored_credentials.alias +" "+ stored_credentials.password );
else
    trace('No Shared Object');

答案 1 :(得分:1)

您应该找出这些值为空的原因并首先修复它。一般来说,如果您期望一个值,它不应该为空。

如果真的预计其中一些值为null,那么您可以先用两种方式检查它们:

if(value != null) value.doSomething();

try{
    Alert.show(stored_credentials.check_remember +" "+ stored_credentials.alias +" "+ stored_credentials.password );
}
catch(e:Error){
    // do something else here if the statement under the try failed.
    // most likely log the error message and see what it is
}

答案 2 :(得分:1)

你的问题在这里:

var dataToLoad:ByteArray = so.data.ws_creds;
if(!dataToLoad)
    return null;

如果没有要加载的数据,则返回null。因此,当您稍后尝试访问返回的对象的属性时,您将获得空对象引用错误,因为您正在引用空对象。 :)

这有几个简单的解决方案。在尝试引用任何属性之前,您可以检查返回值是否为null:

if (stored_credentials != null) {
    Alert.show(stored_credentials.check_remember +" "+ stored_credentials.alias +" "+ stored_credentials.password );
}

或者您可以停止从get_login_share_object函数返回null。你返回的内容完全取决于你,只要确保它返回一个包含你所引用的所有属性的对象。