Как я могу избежать ошибки ссылки на нулевой объект - PullRequest
0 голосов
/ 22 июня 2011

У меня есть функция init, которая запускается при создании приложения. Init вызывает функцию get_login_share_object, в которой создаются объекты, которые являются нулевыми.

Теперь моя проблема в том, что я получаю ошибку нулевой ссылки на объект в предупреждении в init (). Как я могу избежать этого. Возможно ли, что у меня может быть проверка, чтобы видеть, являются ли объекты нулевыми, программа должна просто пропустить чтение объектов.

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 ]

3 голосов
/ 22 июня 2011

Вы можете проверить на ноль, как это:

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 голос
/ 22 июня 2011

Ваша проблема здесь:

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

Если нет данных для загрузки, вы возвращаете ноль. Поэтому, когда вы попытаетесь получить доступ к свойствам возвращаемого объекта позже, вы получите ошибку ссылки на нулевой объект, поскольку вы ссылаетесь на нулевой объект. :)

Есть несколько простых решений для этого. Вы можете проверить, является ли возвращаемое значение нулевым, прежде чем пытаться ссылаться на какие-либо свойства, например:

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

Или вы можете прекратить возвращать нуль из функции get_login_share_object. То, что вы возвращаете, полностью зависит от вас, просто убедитесь, что он возвращает объект со всеми свойствами, на которые вы ссылаетесь.

1 голос
/ 22 июня 2011

Вы должны выяснить, почему эти значения равны нулю, и сначала исправить это.Вообще говоря, если вы ожидаете значение, оно не должно быть нулевым.

Если действительно ожидается, что некоторые из этих значений являются нулевыми, тогда да, вы можете сначала проверить их двумя способами:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...