2011-06-21 32 views
0

我有函數init,它在應用程序的creationComplete上運行。 init調用get_login_share_object函數,其中創建了對象,其中爲空。如何避免空對象引用錯誤

現在我的問題是,我在「init()」的Alert中得到一個空對象引用錯誤。我怎樣才能避免這一點。是否有可能我可以檢查看看,如果對象爲空,程序應該跳過讀取對象。

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

你可以檢查像這樣空:

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

你應該找出爲什麼這些值是零和修復第一。一般來說,如果您期待值,它不應該爲空。

如果真的預計其中一些值爲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 
} 
1

你的問題是在這裏:

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函數返回一個空。您返回的內容完全取決於您,只要確保它返回的對象具有您引用的所有屬性即可。