- 締切済み
2つの“try ~ catch”
こんにちは。 Javaの簡単なネットゲームのサンプルで勉強しています。 ゲームに使う変数[プレイヤー名、プレイヤー座標X,Y プレイヤー残体力]は、プレイヤーごとにハッシュテーブルに格納されることがわかりました。 JavaのハッシュテーブルのデータをJSObjectを使ってJavaScriptに渡したいのですが、ハッシュテーブルも、 JSObjectも try~catch を使っています。 ハッシュテーブルのtry~catch内でなければゲームに使う変数は取得できないと思うのですが、try~catch にJSObjectのtry~catchを入れ子にするようなプログラムの組み方がわかりません。 このような場合どのように組むのでしょうか? ご教授ください。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- deadlock
- ベストアンサー率67% (59/87)
ハッシュテーブルのtry~catchというのが分かりませんが、 try { // ハッシュテーブルを使った処理 ※A try { // JSObjectを使った処理 ※B } catch (JSException e) { // Bで発生した例外の処理 } // ハッシュテーブルを使った処理 ※C } catch (HogeException e) { // NullPointerExceptionなど? // A、Cで発生した例外の処理 } ではいけないでしょうか? Bの例外の後でCの処理を行わなくていいのであれば、以下のようにtryに対してcatchを続けて書いても大丈夫です。 try { // ハッシュテーブルを使った処理 ※A // JSObjectを使った処理 ※B // ハッシュテーブルを使った処理 ※C } catch (HogeException e) { // A、Cで発生した例外の処理 } catch (JSException e){ // Bで発生した例外の処理 } あと、プレイヤー名などを格納する変数をtryの前に書いておけば、try~catchの後に使用できます。 Aや名称取得で例外が発生した時はnameはnullになっています。Cで発生したときはセットされています。 String name = null; try { // ハッシュテーブルを使った処理 ※A name = table.get("PLAYER_NAME"); //名称取得 // ハッシュテーブルを使った処理 ※C } catch (HogeException e) { // Name } // JSObjectを使った処理 ※B // JavaScriptにnameをセット
お礼
deadlockさん。 早速ありがとうございます。 教えていただいた方法で試してみます。 後ほど結果の方を補足いたします。
補足
どうもうまく書き出せないようです。 直接の原因はtry~catchなのか、よくわからない状況です。 といいますのも、参考にしているサンプルプログラムのゲームのメイン処理部分でswitch - caseによってゲームのそれぞれの処理を切り替えて呼び出しているのですが、今回使おうとしているJSObjectのclass名が echo(String word)となっていまして、そのままコンパイルすると、echo(String^ここに")"がありません。というエラーがでてしまいます。 <ゲームのメイン処理> String word; ////////////////////// ゲームのメイン処理 public void MainProc() { switch(status){ case GAME_LOGIN: LoginToServer(); // ログイン処理 playflg = true; // プレイ中 status = GAME_PLAY; break; case GAME_PLAY: // プレイ中 //GetTable(); // 常にプレイ中の情報をもらって更新/描画 echo(word); //この処理をメインの替わりに呼んでいます。 break; case GAME_LOGOUT: ~ 以下略 ~ classの前の行に String word と書いて、switch - caseで呼び出すclass名を echo(word) と直してコンパイルするとエラーは出ないのですが、JSObjectのString変数にはなにもデータが代入されません。 私自身のスキルがまだやろうとしている仕事に必要なレベルに達していないため、説明しきれていません。参考としてJSObject部分とハッシュテーブルデータ取得部分のソースを載せます。 <JSObject部分> public void echo(String word) { try { JSObject win = JSObject.getWindow(this); msg = word; // メッセージをStringで保存 String[] res = new String[] { "入力された文字は" + 出力変数名 + "です。" }; win.call("response", res); } catch (JSException e) { e.printStackTrace(); } } <ハッシュテーブルデータ取得部分> ////////////////////// サーバからテーブル情報をもらって描画 public void GetTable() { // 背景描画 OffGC.drawImage(ScreenImage, 0, 0, null); try{ out.println("tbl"); out.flush(); // テーブル情報を受け取る String line = in.readLine(); StringTokenizer st = new StringTokenizer(line); String cmd = st.nextToken(); // コマンドの取り出し if ("tblinfo".equalsIgnoreCase(cmd)){ line = in.readLine(); // 最初に一行読み込んでおいて while (!".".equals(line)){ // "."だけの行が来るまでループ st = new StringTokenizer(line); // テーブルラインからそれぞれの変数に pname = st.nextToken(); // このテーブルのプレイヤ名 x = Integer.parseInt(st.nextToken()); // キャラ位置 y = Integer.parseInt(st.nextToken()); bx = Integer.parseInt(st.nextToken()); // 爆弾の位置 by = Integer.parseInt(st.nextToken()); life = Integer.parseInt(st.nextToken()); // キャラのHP bstat = Integer.parseInt(st.nextToken()); //爆弾status br = Integer.parseInt(st.nextToken()); // 爆発半径 bcnt = Integer.parseInt(st.nextToken());//起爆カウント // 描画 (プレイヤと敵を描画します) if ~ 中略 ~ // 次の行を読み込む line = in.readLine(); } } }catch(Exception e){ e.printStackTrace(); System.exit(1); } }