home > 投稿 > has no properties ?
2007/01/04

has no properties ?


FlashMediaServer2.0.3(以下、FMS)を利用したときに困ったことのメモ。

FMSへのコネクション数(同時1000とか)が多くなると、頻繁にオブジェクトの参照が出来なくなることがありました。

オブジェクトは存在するけど中身を参照できない。参照するとundefinedが返ってきます。

こいつは困った問題です。

参照するコードの一行前で確実に値を代入していたとしても、

次の行で参照するとundefinedとなり、値が格納されていることを前提に処理を記述しているとエラーが発生します。

1行目で参照できる。

2行目で参照できない。

3行目で参照できる。なんてこともあります。

3行目で参照できたのに2行目で参照できない原因がわかりません。

たとえば以下のようなスクリプトの場合

001:// 前提条件:ユーザ制御クラスのインスタンスが生成されていること
002:// userManager = new UserManager();
003:
004:// スーパークラスを参照する
005:Client.prototype;
006:/**
007: * ユーザを追加する
008: *  
009: */
010:pt.addUser = function( userID, userName ):Void{
011:    userManager.addUser( userID, userName );
012:}
013:/**
014: * ユーザを取得する
015: *  
016: */
017:pt.getUser = function( userID ):Void{
018:    var user = userManager.getUser( userID );
019:    trace( "ユーザ名:" + user["name"] );
020:}
021:/**
022: * ユーザを削除する
023: *  
024: */
025:pt.removeUser = function( userID ):Void{
026:    userManager.removeUser( userID );
027:}
028:// 参照を破棄する
029:delete pt;
001:/**
002: * ユーザ制御クラス
003: * 
004: */
005:UserManager = function(){
006:    this.init();
007:}
008:// スーパークラスを参照する
009:pt = UserManager.prototype;
010:/**
011: * 初期化する
012: * 
013: */
014:pt.init = function(){
015:    // ユーザ情報を管理するオブジェクトを生成する
016:    this.userList = new Object();
017:}
018:/**
019: * ユーザを追加する
020: *  
021: */
022:pt.addUser = function( userID, userName ){
023:    // ユーザIDをキーにしてユーザ名を格納
024:    this.userList[ userID ]            = new Object();
025:    this.userList[ userID ]["name"]    = userName;    
026:}
027:/**
028: * ユーザを取得する
029: *  
030: */
031:pt.getUser = function( userID ){
032:    return this.userList[ userID ];
033:}
034:/**
035: * ユーザを削除する
036: *  
037: */
038:pt.removeUser = function( userID ){
039:    delete this.userList[ userID ];
040:}
041:// 参照を破棄する
042:delete pt;

Clientの19行目とUserManagerの25行目、32行目、39行目でエラーが発生する可能性があります。

オブジェクトにアクセスする箇所は全てif文で囲むだけで解決する簡単なことなのですが、

UserManagerの25行目でエラーが発生したとしても1行前で初期化を行っているので原因がわかりません。

TypeError: userList[userID]["name"] has no properties

ログには、そんなプロパティは存在しないと出力されているだけです。

FMSでオブジェクトにアクセスするときは必ずif文で囲みましょうということなのでしょうか?

034:/**
035: * ユーザを削除する
036: *  
037: */
038:pt.removeUser = function( userID ){
039:    if( userID != undefined ){
040:        delete this.userList[ userID ];
041:    }
042:}

解説しているサイトがありましたらお知らせくださいませ。

トラックバックURL

http://faces2.bascule.co.jp/mt/mt-tb.cgi/523

コメント一覧

こんばんわ。try~catchで囲むというのはNGですかね?

コメントを投稿

(コメントには承認が必要になることがあります。承認されるまではコメントは表示されません。)